第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 }
View Code

 

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 }
View Code

 

4.5 FIFO

 

以上是关于第4章 管道和FIFO的主要内容,如果未能解决你的问题,请参考以下文章

操作系统第3次实验报告:管道

Linux - 进程间通信 - 命名管道

命名管道FIFO

LockSupport.java 中的 FIFO 互斥代码片段

第4章 栈与队列-----队列

FIFO:一个进程从不从管道中读取