☰
Linux 进程间通信:有名管道与无名管道详解(附 C 语言代码示例)
2026/11/6 1:46:02 网站建设 项目流程

基础知识点

头文件:fcntl.h

通讯方式:单工(收音机)、半双工(对讲机)、全双工(打电话)

管道通讯方式:半双工

普通文件在磁盘中分配空间,存储持久,但io相对慢,管道文件在内存中分配空间,io速度快

管道文件必须是两个进程(读写两端)同时以读写方式打开,管道空则读端阻塞,管道满则写端阻塞

有名管道

可用于任意进程间通信

创建有名管道文件:mkfifo fifo

创建两个文件ab,键盘持续写入内容给a,a再写入给管道文件,再由b持续读取管道文件中的内容,最后输出到屏幕:

//文件a.c写端 int fdw = open("fifo",O_WRONLY); if( fdw == -1 ) { printf("open fifo err\n"); exit(1); } printf("fdw = %d\n",fdw); while( 1 ) { char buff[128] = {0}; printf("input\n"); fgets(buff,128,stdin);// if( strncmp(buff,"end",3) == 0 ) { break; } write(fdw,buff,strlen(buff)); } close(fdw);
//文件b.c读端 int fdr = open("fifo",O_RDONLY); if( fdr == -1 ) { printf("open fifo err\n"); exit(1); } printf("fdr=%d\n",fdr); while( 1 ) { char buff[128] = {0}; int n =read(fdr,buff,127); if( n == 0 ) { break; } printf("buff=%s\n",buff); } close(fdr);

管道读端关闭,写端写入数据会产生异常(信号SIGPIPE),终止程序

管道写端关闭,读端读取数据会返回0

无名管道

仅可用于父子进程间通讯

父进程自动创建无名管道文件,用pipe打开,fd[0]读 fd[1]写

父进程只写入,子进程只读取:

int main() { int fd[2]; int res = pipe(fd);//fd[0] r, fd[1] w, if( res == -1 ) { printf("pipe err\n"); exit(1); } pid_t pid = fork(); if( pid == -1 ) { exit(1); } if( pid == 0 ) { close(fd[1]); while( 1 ) { char buff[128] = {0}; int n = read(fd[0],buff,127); if( n == 0 ) { break; } printf("child read:%s\n",buff); } close(fd[0]); } else { close(fd[0]); while( 1 ) { char buff[128] = {0}; fgets(buff,128,stdin); if( strncmp(buff,"end",3) == 0 ) { break; } write(fd[1],buff,strlen(buff)); } close(fd[1]); } exit(0); }

folk复制进程之后,各文件描述符引用次数+1,所以父进程中要关闭读写,子进程中也要关闭读写

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询