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










原文地址:https://www.cnblogs.com/ZhangJinkun/p/4561552.html