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










  • 相关阅读:
    Linux里的2>&1究竟是什么
    表锁操作
    日志rsyslog
    计划任务at cron
    rpm包管理和源码包管理
    自建yum源(只演示nginx服务,其它都一样)
    软件包管理yum
    文件打包及压缩
    查找文件which locate find
    lsof恢复进程打开的文件
  • 原文地址:https://www.cnblogs.com/ZhangJinkun/p/4561552.html
Copyright © 2011-2022 走看看