管道
管道也叫管道文件,是文件的一种。其中分为有名管道和无名管道,有名管道:可以在任意两个进程间通信;无名管道:只能在父子进程间通信。管道的通信方式是半双工的,那么什么是半双工呢?就像收音机、打印机一样。那既然有半双工,当然也会有全双工,全双工就向电话一样双方都可以进行通话。
管道分为读端和写端,顾名思义,写端就是向管道中写入数据,读端就是向管道中读取数据。
有名管道
首先我们通过mkfifo fifo来创建一个管道,接着我们分别创建出读端和写端。
对文件进行进行操作的方法有三种,它们分别是:O_EDONLY只读 O_WRONLY只写 O_EDWR读写(注意,在管道中是没有读写操作的,因为它是一个半双工的模式)
我们用open函数来打开管道,它的头文件是#include <fcntl.h>,函数原型如下:
int open(const char pathname, int flags);//已经创建好了管道
int open(const char pathname, int flags, mode_t mode);//全新创建管道
流程大概如下:
1.我们定义一个整形变量来接受它的返回值,我们知道0(标准输入),1(标准输出),2(标准错误输出)已经被占用,所以理论上它的返回值为3
2.当返回值为-1时,出错
3.我们定义一个信号SIGPIPE**,当触发这个信号时,我们调用fun函数来打印错误
当给一个已经关闭的文件中写入数据时,会产生一个SIGPIPE信号,默认终止程序
4.定义一个足够大的数组并初始化为0,从键盘上获取到的字符都写入到buff中
5.将buff中的字符写入到文件中,并做判断当输入的字符是"end"时,跳出
6.关闭文件描述符并退出程序
代码如下:
void fun(int sig)
{
printf("收到SIGPIPE\n");
}
int main()
{
int fd=open ("fifo",O_WRONLY); //管道有只读和只写权限,读写权限没有定义
printf("fd=%d\n",fd);
if(fd == -1 )
{
return 0;
}
signal(SIGPIPE,fun);//当给一个已经关闭的socket中写入数据时,会产生一个SIGPIPE信号,默认终止程序
while(