Linux IPC Pipe

嵌入式技术

1368人已加入

描述


mkfifo()

//创建有名管道(FIFO special file),创建完了就像普通文件一样open(),再读写,成功返回0,失败返回-1设errno。VS$man 3 mkfifo#include #include int mkfifo(const char *pathname, mode_t mode);

pathname:the FIFO special file's name

mode :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 int pipe(int pipefd[2]); //代码自注释,表示它需要的参数是一个有两个元素的数组,如果虽然作为形参,实质上和int* pipefd没有区别

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#include#include#include#includeint 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("\n"); close(pipefd[0]); return 0;}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 相关推荐

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分