如果读端关闭,写端继续向管道内写数据将会导致管道破裂,内核将会发送信号SIGPIPE到进程中,该信号的默认处理方式为结束进程;
如果写端关闭,读端继续从管道中读取数据将会读不到任何数据;
管道文件的大小固定为64K,如果写入数据超过64K并且没有对数据进行读操作,那后续写入动作将会被阻塞。
半双工通信,可读可写,不可以同时读写。
有名管道可用于读写;在磁盘系统中存在;函数:mkfifo
read.c
/*===============================================
* 文件名称:read.c
* 创 建 者:cxy
* 创建日期:2024年02月06日
* 描 述:
================================================*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main(int argc, char *argv[])
{mkfifo("myfifo",0664); //创建有名管道文件int fd = open("./myfifo",O_RDONLY);char buf[30] = {0};while(1){read(fd,buf,sizeof(buf));printf("%s\n",buf);memset(buf,0,sizeof(buf));}return 0;
}
write.c
/*===============================================
* 文件名称:read.c
* 创 建 者:cxy
* 创建日期:2024年02月06日
* 描 述:
================================================*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main(int argc, char *argv[])
{int fd = open("./myfifo",O_WRONLY);char buf[30] = {0};int len;while(1){fgets(buf,sizeof(buf),stdin);len = strlen(buf);if(buf[len-1] == '\n') buf[len-1] = '\0';write(fd,buf,sizeof(buf));}return 0;
}
结果
读端关闭:继续写,管道破裂,进程结束。
写端关闭:读端将读不到任何数据