第4章 管道和FIFO
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第4章 管道和FIFO相关的知识,希望对你有一定的参考价值。
4.1 管道
管道是由pipe函数创建的,提供一个单向数据流。
头文件 | #include <unistd.h> |
函数原型 | int pipe(int fd[2]); |
返回值 | 成功则为0,出错则为-1 |
函数功能 | 该函数返回两个文件描述符:fd[0]和fd[1]。fd[0]用来读操作,fd[1]用来写操作 |
说明 | 管道只能用于有亲缘关系进程间通讯。要实现非亲缘关系进程间通讯用有名管道FIFO |
4.2 管道实现半双工通讯
实现的步骤:
(1)创建管道(fd[0]和fd[1])
(2)fork
(3)父进程关闭管道的读端(fd[0])
(4)子进程关闭管道的写端(fd[1])
(5)父进程往管道的写端(fd[1])写入数据
(6)子进程从管道的读端(fd[0])读出数据
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 5 #define READ_MAX_LEN 10 6 7 int main() 8 { 9 pid_t childpid = 0; 10 int pipefd[2] = {0}; 11 char buf[READ_MAX_LEN + 1] = {0}; 12 13 if (pipe(pipefd) < 0) 14 { 15 printf("pipe error"); 16 return -1; 17 } 18 19 childpid = fork(); 20 21 if (childpid < 0) 22 { 23 printf("fork error\\n"); 24 return -1; 25 } 26 27 // 子进程 28 if (childpid == 0) 29 { 30 close(pipefd[1]); 31 32 read(pipefd[0], buf, READ_MAX_LEN); 33 printf("child:%s\\n", buf); 34 35 exit(0); 36 } 37 38 // 父进程 39 close(pipefd[0]); 40 41 write(pipefd[1], "hello", sizeof("hello")); 42 printf("parent:%s\\n", "hello"); 43 44 waitpid(childpid, NULL, 0); 45 46 return 0; 47 }
4.3 管道实现全双工通讯
实现的步骤:
(1)创建管道1(fd1[0]和fd1[1])、管道2(fd2[0]和fd2[1])
(2)fork
(3)父进程关闭管道1的读端(fd1[0])、关闭管道2的写端(fd2[1])
(4)子进程关闭管道1的写端(fd1[1])、关闭管道2的读端(fd2[0])
(5)父、子进程间通讯
4.4 popen 和 pclose 函数
头文件 | #include <stdio.h> | |
函数原型 | FILE *popen(const char *command, const char *type); | |
int pclose(FILE *stream); | ||
返回值 | 成功返回文件描述符,失败返回NULL | |
参数 | command | shell命令,这行命令将被传到 bin/sh 并使用-c 标志 |
type | r:读到commond的标准输出 | |
w:写到command的标准输入 | ||
说明 | popen创建的文件描述符,必须由pclose关闭。 |
1 #include <stdio.h> 2 #include <string.h> 3 4 #define BUF_MAX_LEN 100 5 6 int main() 7 { 8 FILE *fp = NULL; 9 char buf[BUF_MAX_LEN + 1] = {0}; 10 11 fp = popen("ls", "r"); 12 if (fp == NULL) 13 { 14 printf("popen error\\n"); 15 return -1; 16 } 17 18 while (fgets(buf, BUF_MAX_LEN, fp) != NULL) 19 { 20 fputs(buf, stdout); 21 } 22 23 pclose(fp); 24 25 return 0; 26 }
4.5 FIFO
以上是关于第4章 管道和FIFO的主要内容,如果未能解决你的问题,请参考以下文章