linux系统编程

您所在的位置:网站首页 linux编程创建文件 linux系统编程

linux系统编程

2023-06-10 17:05| 来源: 网络整理| 查看: 265

管道pipe

 管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程和兄弟进程关系。

#include int pipe(int pipefd[2]);

调用pipe函数,会在内核中开辟出一块缓冲区用来进行进程间通信,pipe函数接受一个参数,是包含两个整数的数组,如果调用成功,会通过pipefd[2]传出给用户程序两个文件描述符,需要注意pipefd[0]指向管道的读端, pipefd[1]指向管道的写端,那么此时这个管道对于用户程序就是一个文件,可以通过read(pipefd [0]);或者write(pipefd [1])进行操作。pipe函数调用成功返回0,否则返回-1。

代码示例

1.父进程创建管道,得到两个文件描述符分别指向管道的读端和写端

2.利用fork函数创建出子进程,则子进程也得到两个文件描述符指向同一管道

3.父进程关闭读端,子进程关闭写端,父进程可以往管道中进行写操作,子进程可以从管道中读

#include #include #include #include int main() { int fd[2]; int pid; char buf[128]; if(pipe(fd) == -1)//创建管道 返回-1则失败 { perror("pipe"); } pid = fork();//创建子进程 if(pid < 0) { printf("creat child filed\n"); } else if(pid > 0) { sleep(3); printf("this is father\n"); close(fd[0]);//关闭父进程读端 保留写端 write(fd[1],"hello from father",strlen("hello from father")); wait(); }else { printf("this is child\n"); close(fd[1]);//关闭子进程写段 保留读端 read(fd[0],buf,128); printf("read form father:%s\n",buf); exit(0); } return 0; }

编译运行

        如果所有指向管道写端的文件描述符都关闭了,而仍然有进程从管道的读端读数据,那么管道中剩余的数据都被读取后,再次read会返回0,就像读到文件末尾一样

        如果有指向管道写端的文件描述符没关闭,而持有管道写端的进程也没有向管道中写数据,这时有进程从管道读端读数据,那么管道中剩余的数据都被读取后,再次read会阻塞,直到管道中有数据可读了才读取数据并返回。

        如果所有指向管道读端的文件描述符都关闭了,这时有进程指向管道的写端write,那么该进程会收到信号SIGPIPE,通常会导致进程异常终止。

        如果有指向管道读端的文件描述符没关闭,而持有管道写端的进程也没有从管道中读数据,这时有进程向管道写端写数据,那么在管道被写满时再write会阻塞,直到管道中有空位置了才写入数据并返回。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3