我是靠谱客的博主 愤怒寒风,这篇文章主要介绍linux系统编程——管道pipe,现在分享给大家,希望可以做个参考。

管道pipe

内核中的缓冲区,多数使用队列(数据结构)来实现的。而队列多采用环形队列,一般采用阻塞机制,还有另一种机制是覆盖机制(当队列满的时候,后入队的覆盖之前的数据)。

 

下边例1 完成的功能就是 父进程向管道中写数据,子进程读父进程写的数据。

——例1

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/************************************************************************* > Created Time: 2016年08月08日 星期一 17时37分47秒 ************************************************************************/ #include <stdio.h>#include <unistd.h>#include <string.h>#include <stdlib.h> #include <sys/wait.h> int main(void) { int fd[2]; char str[1024] = "hello xuxing"; char buf[1024]; pid_t pid; //fd[0] 读数据端 //fd[1] 写数据端 if(pipe(fd) < 0) { /* 错误日志 */ perror("pipe"); exit(1); } pid = fork(); //父写子读 if(pid > 0) { //父进程里边,关闭父读 close(fd[0]); write(fd[1], str, strlen(str)); sleep(3); wait(NULL); } else if (pid == 0) { //子进程里边,关闭子写 int len; close(fd[1]); len = read(fd[0], buf, sizeof(buf)); sprintf(str, "child %sn", buf); write(STDOUT_FILENO, buf, len); } else { perror("fork"); exit(1); } return 0; }

##重要图解——pipe





注意:

一定是先创建管道,之后在fork进程。

 

重要知识点

管道的读写端通过打开的文件描述符来传递,因此要通信的两个进程必须从共同祖先哪里继承管道文件描述符。上边的例子是父进程把文件描述符传给子进程,也可以父进程fork两次,把文件描述符传递给两个子进程,然后两个子进程之间通信,总之需要通过fork传递文件描述符使得两个进程都能同时访问同一个管道。

使用管道需要注意一下4种特殊情况(假设都是阻塞I/O操作)

1、 所有指向管道的写端的文件描述符都关闭了

2、 如果有指向管道写端的文件描述符没有关闭(管道写端的引用计数大于0),管道写端的进程也没有向管道中写数据,这时候有进程从管道读端读数据,那么管道数据被读取后,再次read会阻塞

3、 所有指向管道读端的文件描述符都关闭了(管道引用计数等于0),这时候有进程向管道写端write,那么进程会受到信号SIGPIPE,通常会导致进程终止

4、 如果有指向管道读端的文件描述符,没有关闭(管道读端引用计数大于0)管道读端的进程也没有从管道中读数据,这时候有进程向管道写端写数据,那么write会发生阻塞,知道管道中有了空位置才写入数据比并返回。

——例2

计算一个管道pipe缓冲区的大小


复制代码
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>#include <unistd.h> int main(void) { int fd[2]; pipe(fd); printf("pipe buf %ldn", fpathconf(fd[0], _PC_PIPE_BUF)); printf("%ldn", fpathconf(STDOUT_FILENO, _PC_NAME_MAX)); printf("%ldn", pathconf("hello", _PC_NAME_MAX)); return 0; }



最后

以上就是愤怒寒风最近收集整理的关于linux系统编程——管道pipe的全部内容,更多相关linux系统编程——管道pipe内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部