本文共 4187 字,大约阅读时间需要 13 分钟。
管道 | 用于传输数据 |
---|---|
特性 | 半双工通信–可以选择方向的单向通信 |
本质 | 管道就是内核中的一块缓冲区(内存) |
分类 | 匿名管道,命名管道 |
int pipe(int pipefd[2])
代码如下(示例):
1 #include2 #include 3 #include 4 #include 5 int main() 6 { 7 int pipefd[2]; 8 int ret = pipe(pipefd); 9 if(ret < 0){ 10 perror("pipe error"); 11 return -1; 12 } 13 pid_t pid = fork(); 14 if(pid < 0){ 15 perror("fork error"); 16 exit(-1); 17 }else if(pid == 0){ 18 //child 19 char buf[1024] = { 0}; 20 int ret = read(pipefd[0], buf, 1023); 21 if(ret < 0){ 22 perror("read error"); 23 return -1; 24 } 25 printf("buf:%s\n", buf); 26 }else{ 27 //parent 28 char *ptr = "今天好困呐!!\n"; 29 int ret = write(pipefd[1], ptr, strlen(ptr)); 30 if(ret < 0){ 31 perror("write error"); 32 return -1; 33 } 34 printf("写入成功\n"); 35 } 36 return 0; 37 }
结果:
注意:在进程中把不使用的管道一端一定要关掉,防止一些不必要的问题
1 #include2 #include 3 #include 4 #include 5 int main() 6 { 7 int pipefd[2]; 8 int ret = pipe(pipefd); 9 if(ret < 0){ 10 perror("pipe error"); 11 return -1; 12 } 13 if(fork() == 0){ 14 dup2(pipefd[1], 1); 15 execlp("ps", "ps", "-ef", NULL); 16 exit(-1); 17 } 18 if(fork() == 0){ 19 dup2(pipefd[0], 0); 20 execlp("grep","grep", "pipe", NULL); 21 exit(-1); 22 } 23 wait(NULL); 24 wait(NULL); 25 return 0; 26 }
代码操作:
int mkfifo(const char*pathname,mode_t mode);
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 int main() 8 { 9 umask(0); 10 char *fifo_name = "./test.fifo"; 11 int ret = mkfifo(fifo_name, 0664); 12 if(ret < 0 && errno != EEXIST){ 13 perror("mkfifo error"); 14 return -1; 15 } 16 //open(文件名, 打开方式, 权限) 17 int fd = open(fifo_name, O_RDONLY); 18 if(fd < 0){ 19 perror("open error"); 20 return -1; 21 } 22 printf("open fifo success\n"); 23 return 0; 24 }
程序阻塞
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 int main() 9 { 10 umask(0); 11 char *fifo_name = "./test.fifo"; 12 int ret = mkfifo(fifo_name, 0664); 13 if(ret < 0 && errno != EEXIST){ 14 perror("mkfifo error"); 15 return -1; 16 } 17 int fd = open(fifo_name, O_WRONLY); 18 if(fd < 0){ 19 perror("open error"); 20 return -1; 21 } 22 while(1){ 23 char buf[1024] = { 0}; 24 scanf("%s", buf); 25 int ret = write(fd, buf, strlen(buf)); 26 if(ret < 0){ 27 perror("write error"); 28 return -1; 29 } 30 } 31 close(fd); 32 return 0; 33 }
转载地址:http://pybnz.baihongyu.com/