你好,游客 登录 注册 搜索
背景:
阅读新闻

Linux进程间管道通信

[日期:2016-10-08] 来源:Linux社区  作者:xiaojiang1025 [字体: ]

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

本文永久更新链接地址http://www.linuxidc.com/Linux/2016-10/135809.htm

linux
相关资讯       Linux进程  Linux管道通信 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款