Welcome 微信登录

首页 / 操作系统 / Linux / Linux进程间管道通信

Linux进程间管道通信

mkfifo()

//创建有名管道(FIFO special file),创建完了就像普通文件一样open(),再读写,成功返回0,失败返回-1设errno。VS$man 3 mkfifo#include <sys/types.h>#include <sys/stat.h>int mkfifo(const char *pathname, mode_t mode);pathname:the FIFO special file"s namemode :the FIFO"s permissions.//创建FIFO管道文件int res=mkfifo(“./a.fifo”,0664);if(-1==res)perror("mkfifo"),exit(-1);res=open(“./a.fifo”,O_RDONLY);if(-1==res)perror(“open”),exit(-1);

pipe()

//创建无名管道,相当于直接把open()返回的fd直接放到形参中,而不需额外的变量接收管道文件的描述符,用于父子进程间通过管道进行IPC通信,,成功返回0,失败返回-1设errno#include <unistd.h>int pipe(int pipefd[2]);pipefd :return two fds referring to the ends of the pipe.
  • pipefd[0] :read end,读端
  • pipefd[1] :write end,读端.
fork()创建的child也会文件描述符总表也会复制一份So,对于child, 应该先关闭读端, 再写,对于parent,应该先关闭写端, 再读//使用pipe()实现父子进程的通信#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<stdlib.h>#include<stdio.h>int main(){//1. 创建无名管道int pipefd[2];int res=pipe(pipefd);if(-1==res)perror("pipe"),exit(-1);//2. 创建子进程pid_t pid=fork();if(-1==pid)perror("fork"),exit(-1);//3. 子进程开始启动,写入1~100;if(0==pid){close(pipefd[0]);int i=0;for(i=1;i<=100;i++){write(pipefd[1],&i,sizeof(int));}close(pipefd[1]);//关闭写端exit(0);}//4. 父进程开始启动,读取管道中的数据close(pipefd[1]);int i=0;for(i=1;i<=100;i++){int x=0;read(pipefd[0],&x,sizeof(int));printf("%d ",x);}printf(" ");close(pipefd[0]);return 0;}本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-10/135809.htm