资讯详情

资讯详情

Linux 进程间通信:有名管道与无名管道详解(附 C 语言代码示例)

基础知识点头文件fcntl.h通讯方式单工收音机、半双工对讲机、全双工打电话管道通讯方式半双工普通文件在磁盘中分配空间存储持久但io相对慢管道文件在内存中分配空间io速度快管道文件必须是两个进程读写两端同时以读写方式打开管道空则读端阻塞管道满则写端阻塞有名管道可用于任意进程间通信创建有名管道文件mkfifo fifo创建两个文件ab键盘持续写入内容给aa再写入给管道文件再由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所以父进程中要关闭读写子进程中也要关闭读写
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →