首页 > 系统服务 > 详细

进程间通信——管道

时间:2019-02-21 17:05:17      阅读:155      评论:0      收藏:0      [点我收藏+]

一、管道描述

管道:单向、传输、封闭、一个进口一个出口、先进先出

水管:内核空间一个管道文件
家:出水口 读端文件描述符
水厂:进水口 写端文件描述符

 

1.无名管道:只能用在父子进程间通信
操作函数
#include <unistd.h>
int pipe(int filedes[2]);

创建成功,返回值0,创建失败,返回值-1


这个函数会创建一个管道,并且数组filedes中的两个元素会成为管道读端和写端对应的两个文件描述符。即filedes[0]读端,filedes[1]写端。filedes[0]有可读属性,filedes[1]有可写属性。

管道两端的关闭是有先后顺序的,如果先关闭写端则从另一端读数据时,read函数将返回0,表示管道已经关闭;但是如果先关闭读端,则从另一端写数据时,将会使写数据的进程接收到SIGPIPE信号,如果写进程不对该信号进行处理,将导致写进程终止,如果写进程处理了该信号,则写数据的write函数返回一个负值,表示管道已经关闭。

 


2.有名管道:(一个特殊的文件,管道文件p)
无名管道只能在亲缘关系的进程间通信,大大限制了管道的使用,有名管道突破了这个限制,通过指定路径名的形式实现任意进程间的通信。

2.1使用命令创建
mkfifo FIFO_NAME
删除管道文件
unlink FIFO_NAME

一个终端
cat /tmp/my_fifo
另一个终端
echo hello > /tmp/my_fifo


2.2使用系统调用函数:
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);


#include <unistd.h>
int unlink(const char *pathname);

 


对管道的操作,先打开,然后就读写

打开
open("/tmp/my_fifo",O_WRONLY|O_NONBLOCK)//非阻塞方式打开

error全局变量存放错误码,perror根据错误码打印出错误提示语句
perror("open");

如果以读取方式打开FIFO,并且还没有其它进程以写入方式打开FIFO,open函数将被阻塞;同样,如果以写入方式打开FIFO,并且还没其它进程以读取方式FIFO,open函数也将被阻塞。但是,如果open函数中包含O_NONBLOCK选项,则上述两种情况下调用open都不被阻塞

与无名管道相同,关闭FIFO时,如果先关读取端,将导致继续往FIFO中写数据的进程收到SIG_PIPE的信号。

 

进程间通信——管道

原文:https://www.cnblogs.com/shiyk/p/10413664.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!