当前位置:网站首页>unix系统编程 第十五章 15.2管道
unix系统编程 第十五章 15.2管道
2022-08-09 10:26:00 【玛丽苏打肉饼】
管道是UNIX系统IPC的最古老形式,所有UNIX系统都提供此种通信机制。
管道有以下两种局限性:
- 历史上,它们是半双工的(即数据都只在一个方向上面流动)。现在某些系统提供全双工管道。
- 管道只能在具有公共祖先的两个进程之间使用,通常,一个管道由一个进程创建,在进程调用fork之后,这个管道就能在父进程和子进程之间使用了。
我们将会看到FIFO没有第二种局限性,UNIX域套接字没有这两种局限性。
管道是通过调用pipe函数创建的。
#include <unistd.h>
int pipe(int fd[2]);//返回值,成功返回0,出错返回-1
经由参数fd返回两个文件描述符:fd[0]为读而打开,fd[1]为写而打开。fd[1]的输出是fd[0]的输入。
单个进程的管道几乎没有任何用处,通常,进程会先调用pipe,接着调用fork,从而创建从父进程到子进程的IPC通道,反之亦然。
fork之后做什么取决于我们想要的数据流方向,对于从父进程到子进程的管道,父进程关闭管道的读端,子进程关闭写端。
当管道一端被关闭以后,下列两条规则起作用。
- 当读一个写端已被关闭的管道时,在所有数据都被读取后,read返回0,表示文件结束。
- 如果写一个读端已被关闭的通道,则产生信号SIGPIPE.如果忽略该信号或者捕捉该信号并从其处理程序返回,则write返回-1,errno设置为EPIPE。
示例程序:
#include "apue.h"
int main()
{
int n;
int fd[2];
pid_t pid;
char line[MAXLINE];
if(pipe(fd)<0)
err_sys("pipe error");
if((pid=fork())<0)
err_sys("fork error");
else if(pid>0)
{
close(fd[0]);
write(fd[1],"hello world\n",12);
}
else
{
close(fd[1]);
n=read(fd[0],line,MAXLINE);
write(STDOUT_FILENO,line,n);
}
exit(0);
}
边栏推荐
猜你喜欢
随机推荐
好久没更新博客了
深度学习--生成对抗网络(Generative Adversarial Nets)
2021-01-11-雪碧图做表情管理器
[项目配置] 配置Qt函数库和ui界面库的封装并调用的项目
By asking where the variables are stored, the shepherd boy laughed and said to use pointers, Go lang1.18 introductory refining tutorial, from Bai Ding to Hongru, the use of go lang type pointers (Poin
Nodejs服务端
[相机配置] 海康相机丢包配置环境
The GNU Privacy Guard
认识
可能95%的人还在犯的PyTorch错误
常用语言图表库总结
Technology Sharing | How to simulate real usage scenarios?mock technology to help you
笔记本电脑使用常见问题,持续更新
xmms播放器加了播放列表的管理功能
强化学习 (Reinforcement Learning)
【原创】VMware Workstation实现Openwrt软路由功能,非ESXI,内容非常详细!
抛出一个问题? Mysql环境下进行Count操作执行的时候速度很慢_需手动给主键添加索引---MySql优化001
技术分享 | 使用 cURL 发送请求
Multi-threaded cases - timer
第二周作业