linux系统编程——管道pipe
来源:互联网 发布:分布式服务架构python 编辑:程序博客网 时间:2024/05/16 16:23
管道pipe
内核中的缓冲区,多数使用队列(数据结构)来实现的。而队列多采用环形队列,一般采用阻塞机制,还有另一种机制是覆盖机制(当队列满的时候,后入队的覆盖之前的数据)。
下边例1 完成的功能就是 父进程向管道中写数据,子进程读父进程写的数据。
——例1:
/*************************************************************************> 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 %s\n", 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缓冲区的大小
#include <stdio.h>#include <unistd.h>int main(void){int fd[2];pipe(fd);printf("pipe buf %ld\n", fpathconf(fd[0], _PC_PIPE_BUF));printf("%ld\n", fpathconf(STDOUT_FILENO, _PC_NAME_MAX));printf("%ld\n", pathconf("hello", _PC_NAME_MAX));return 0;}
1 0
- linux系统编程——管道pipe
- Linux系统编程——进程间通信:管道(pipe)
- Linux系统编程——进程间通信:管道(pipe)
- Linux系统编程——进程间通信:管道(pipe)
- linux系统编程之管道(一):匿名管道(pipe)
- linux系统编程之管道 匿名管道(pipe)
- linux系统编程之管道(一):匿名管道(pipe)
- linux操作系统编程——简单的pipe管道
- 【Linux系统编程】进程间通信--无名管道(pipe)
- Linux C编程 - 管道pipe
- Linux C编程 - 管道pipe
- Linux系统编程之管道:匿名管道pipe与命名管道fifo
- 管道pipe——Linux学习笔记
- Linux学习笔记——管道PIPE
- linux系统编程之管道(一):匿名管道和pipe函数
- linux系统编程之管道(二):管道读写规则和Pipe Capacity、PIPE_BUF
- linux系统编程之管道(二):管道读写规则和Pipe Capacity、PIPE_BUF
- Linux系统编程之管道:管道的读写规则与Pipe Capacity以及PIPE_BUF
- linux 内核出现CPU 死机
- tjut 2857
- MSP430 开发注意事项要求
- android adb 显示error
- 【Linux】stat命令查看文件的三个时间
- linux系统编程——管道pipe
- 协同过滤推荐算法
- 如何使用 vimdiff 来 git diff 和merge diff
- 【暑期第二次训练赛】小火山的爱情密码(尺取法)
- 第一回 穷人的愤怒,拥有一块铁去对抗两把匕首
- Mac如何让 Finder 显示隐藏文件和文件夹
- vim便捷命令:高亮搜索& 多行注释 和 取消多行注释
- Liunx的启动流程、模块管理与Loader
- React简要说明