linux系统编程 |
您所在的位置:网站首页 › linux编程创建文件 › linux系统编程 |
管道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 |