进程间通信-命名管道fifo

练习:兄弟进程间通信ls |wc - l

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
void exit(int);
void sys_error(const char *str){
        perror(str);
        exit(1);
}
int main(int argc,char *agrv[]){
    pid_t pid_ret1;
    int i=0;
    int fd[2];
    int ret = pipe(fd);
    if(-1 == ret)
    {
        sys_error("pipe failed");
    }
    for(;i<2;i++){
        pid_ret1 = fork();
        if(-1 == pid_ret1){sys_error("fork failed");}
        if(0 == pid_ret1){break;}//子进程关闭
    }
    //父进程
    if(2 == i){
//必须保证管道中数据是单向流动的,不能同时多个读端和写端
        close(fd[0]);
        close(fd[1]);
        wait(NULL);
        wait(NULL);
    }
    //兄弟
    if(0 == i)
    {
            close(fd[0]);
            dup2(fd[1],STDOUT_FILENO);
            execlp("ls","ls",NULL);
            //以下两行是不能执行的,由于execlp.
            close(fd[1]);
            printf("bro1\n");
    }
    //兄弟
    if(1 == i)
    {
            close(fd[1]);
            sleep(1);
            dup2(fd[0],STDIN_FILENO);
            execlp("wc","wc","-l",NULL);
            close(fd[0]);       
            printf("parent\n");
    }
}
命名管道fifo

应用:无血缘关系的进程间。
1、创建方式
命令:mkfifo FIFO名字
函数:int mkfifo(pathname,mode)

2、使用命名管道类似于使用文件读写
open/read/write

共享内存映射

mmap 允许反复读取
而fifo只允许读取一次。
代码参照课堂Code.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一.管道机制(pipe) 1.Linux的fork操作 在计算机领域中,尤其是Unix及类Unix系统操作系统中,...
    Geeks_Liu阅读 9,059评论 1 9
  • 前言 管道是UNIX环境中历史最悠久的进程间通信方式,也是最简单的进程间通信方式,一般用来作为IPC的入门,最合适...
    GeekerLou阅读 4,937评论 0 6
  • 进程间通信在两个进程之间,每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到。比如,在...
    basetree阅读 4,160评论 0 0
  • 信号信号是linux操作系统进程间通信的一种方式,一个应用进程可以接受、发送信号给另一个进程,当进程捕获到某个信号...
    zhile_doing阅读 3,388评论 0 0
  • 0、安排学生彻底打扫教室、卫生区。 1、收寒假作业,优秀名单。 2、统计好人好事。 3、读书作业,挑5份,写总...
    果果mama阅读 1,248评论 0 0