赞
踩
无名管道属于单向通讯
无名管道只能用于父子进程通讯
无名管道发送端叫做写端,接收端叫做读端
无名管道将读端与写端抽象成两个文件进行操作,在无名管道创建成功之后,则会将读端与写端的文件描述符存入数组
#include <unistd.h>
int pipe(int pipefd[2]);
管道创建之后,内核会将文件描述符存储到数组
pipefd:用于存储无名管道读端与写端的文件描述符的数组
pipefd[0]:读端文件描述符
pipefd[1]:写端文件描述符
成功:0
失败:-1,设置 errno
创建一个子进程,负责循环从管道中读取数据,父进程从键盘读取数据后,写入到管道中,输入 “quit” 字符
串时退出
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> int main() { int pipefd[2]; pid_t pid; char buf[1024]; if (pipe(pipefd) == -1) { perror("pipe"); exit(EXIT_FAILURE); } pid = fork(); if (pid == -1) { perror("fork"); exit(EXIT_FAILURE); } if (pid == 0) { close(pipefd[1]); while (1) { memset(buf,0,strlen(buf)); ssize_t n = read(pipefd[0], buf, sizeof(buf)); if (n <= 0||(strncmp(buf,"quit",4)==0)) { printf("fork 退出!\n"); break; } putchar('\n'); printf("子进程接收到: %s\n", buf); } close(pipefd[0]); exit(EXIT_SUCCESS); } else { close(pipefd[0]); while (1) { memset(buf,0,strlen(buf)); printf("请输入要发送的数据(输入 'quit' 退出):"); fgets(buf, sizeof(buf), stdin); buf[strlen(buf)-1]='\0'; write(pipefd[1], buf, strlen(buf)); if (strncmp(buf, "quit", 4) == 0) { close(pipefd[1]); break; } } wait(NULL); } return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。