zoukankan      html  css  js  c++  java
  • IPC --- 管道


    1.在两个进城之间建立数据流通的管道


    2.可以单向也可以双向


    3.和文件类似,但是数据读出后,管道中就没有信息了


    4.匿名半双工管道:


    ls | grep * ,ls的输出是grep的输入,匿名半双工管道只是 系统的资源,但是没有实名,不可能在文件系统中以任何文件的形式看到管道


    中的内容,进程结束就会被系统清除


    5.

    1. #include<unistd.h>

    2. #include<stdio.h>

    3. #include<stdlib.h>

    4. int main()

    5. {

    6. int fd[2];

    7. if(pipe(fd)==-1)

    8. {

    9. perror("create pipe fail");

    10. exit(-1);

    11. }

    12. char wbuf[] = "Hello,I am pipe!";

    13. if(write(fd[1],wbuf,sizeof(wbuf))==-1)

    14. {

    15. perror("write fail");

    16. }

    17. char rbuf[sizeof(wbuf)];

    18. if(read(fd[0],rbuf,sizeof(wbuf))==-1)

    19. {

    20. perror("read fail");

    21. }

    22. puts(rbuf);

    23. close(fd[0]);

    24. close(fd[1]);

    25. return 0;

    26. }


    注意:两个文件描述符没有和任何有名文件相关联,不存在实际意义上的文件


    pipe函数原型:


    1. #inlcude<unistd.h>

    2. int pipe(int fd[2])

    3. 成功返回0,反之为-1


    匿名管道限制:


    1.单方向传输信息,fd[1]只能是写入端,fd[0]只能是读取端


    2.匿名管道只适用于有血缘关系的进程,比如父子进程和兄弟进程


    3.当管道读端关闭,写端依然写入的时候,产生SIGPIPE信号,程序陷入中断


    4.当管道写端关闭,读端依然读入的时候,read函数返回从管道中读取的字节数,如果管道中无数据的时候,就返回0,反之返回读取的字


    节数


    6.管道实现父子进程间通信


        父进程向子进程发送信息:


    1. #include<stdio.h>
    2. #include<unistd.h>
    3. #include<string.h>
    4. int main()
    5. {
    6. int fd[2];
    7. pipe(fd);
    8. pid_t pid = fork();
    9. char buf[6]= "Hello";
    10. char rbuf[6]={0};
    11. if(pid!=0)
    12. {
    13. close(fd[0]);
    14. write(fd[1],buf,6);
    15. close(fd[1]);
    16. }
    17. else if(pid==0)
    18. {
    19. close(fd[1]);
    20. read(fd[0],rbuf,6);
    21. puts(rbuf);
    22. close(fd[0]);
    23. }
    24. return 0;
    25. }

        子进程向父进程发送信息:


    1. #include<stdio.h>
    2. #include<unistd.h>
    3. #include<string.h>
    4. int main()
    5. {
    6. int fd[2];
    7. pipe(fd);
    8. pid_t pid = fork();
    9. char buf[6]= "Hello";
    10. char rbuf[6]={0};
    11. if(pid==0)
    12. {
    13. close(fd[0]);
    14. write(fd[1],buf,6);
    15. close(fd[1]);
    16. }
    17. else if(pid!=0)
    18. {
    19. close(fd[1]);
    20. read(fd[0],rbuf,6);
    21. puts(rbuf);
    22. close(fd[0]);
    23. }
    24. return 0;
    25. }










  • 相关阅读:
    lambba表达式
    根据某个字段筛选list数据
    git和idea绑定
    gitee创建仓库
    用 Python 3 + PyQt5 擼了一個可以播放“任意”音樂的播放器
    zabbix 共享内存设置
    Zabbix高可用,实现zabbix的无缝切换,无故障时间
    python练习题100
    斐波那契数列python实现
    随机生成指定位数密码包括大小写数字特殊符号
  • 原文地址:https://www.cnblogs.com/ZhangJinkun/p/4561552.html
Copyright © 2011-2022 走看看