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. }










  • 相关阅读:
    NanoProfiler
    NanoProfiler
    Open Source Cassandra Gitbook for Developer
    Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理
    Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复
    Android Fragment使用(二) 嵌套Fragments (Nested Fragments) 的使用及常见错误
    Android Fragment使用(一) 基础篇 温故知新
    Set up Github Pages with Hexo, migrating from Jekyll
    EventBus源码解析 源码阅读记录
    Android M Permission 运行时权限 学习笔记
  • 原文地址:https://www.cnblogs.com/ZhangJinkun/p/4561552.html
Copyright © 2011-2022 走看看