Linux笔记(17)-进程间通信(管道)

  1. IPC:InterPocess Communication(进程间通信)
1. 进程间通信常用方式:
    a. 管道         --      简单
    b. 信号         --      系统开销小
    c. 共享映射区   --      有无血缘关系的进程间都可以通信
    d. 本地套接字   --      稳定
    除此之外还可以使用文件等来进行通信
  1. 管道简介:
1. 管道本质
    a. 管道是一块内核缓冲区,匿名管道在磁盘上是没有对应的磁盘文件的
    b. 可以看作是一个伪文件,操作方式与操作文件类似  --  伪文件,不占用磁盘空间,即占用一个内核缓冲区
2. 管道特点
    a. 包含两部分:读端,写端  --  对应于两个文件描述符
    b. 数据从写端流入,从读端流出 -- 即数据在管道中流过
    c. 该管道占用的缓冲区由系统释放,当操作完管道的进程结束后,管道自动销毁
    d. 管道的两端默认是阻塞的
3. 管道的原理
    a. 内部实现方式:环形队列
    b. 缓存区大小:默认为4K
4. 管道的局限性
    a. 数据只能读取一次,读取完就出队了
    b. 实现方式以半双工方式
        单工:遥控器
        半双工:对讲机 -- 数据流动时是单向的,一方传,另一方只能接收
        双工:电话 -- 数据可以同时双向流动
    c. 匿名管道:适合具有血缘关系的进程间通信
  1. 创建匿名管道:pipe函数
1. 函数原型:
    int pipe(int pipefd[2]);
2. 参数:
    pipefd[2]是一个传出参数,即系统创建管道后,读端写端存储在该数组中
    pipefd[0]:读端<其实为一个fd文件描述符>
    pipefd[1]:写端<其实为一个fd文件描述符>
3. 返回值
    0:创建成功
    -1:创建失败
4. 例如:
    {
        int pipefd[2];
        int ret = pipe(pipefd);
        if(ret == -1)
        {
            perror("pipe error");
            exit(1);
        }
        printf("pipefd[0] = %d\n",pipefd[0]);   //默认一般为3
        printf("pipefd[1] = %d\n",pipefd[1]);   //默认一般为4
    }
5. 进程间通信
    对于有血缘关系的进程通信时,应注意在父进程创建管道后再fork创建子进程。
    这样保证父子进程的pipefd数组中文件描述符一致
  1. 注意事项
1. 虽然单个进程内可以使用管道进行通信,但是没有必要使用
2. 由于管道的读或写都是阻塞的,即管道中没有内容,读会等待;如果没有要写的内容,写会等待
    因此,即使写的慢,读的快,也不用使用sleep函数进行等待
3. 当需要重定向输出时,使用dup/dup2函数操作文件描述符
    dup2(pipefd[0], 0);  //0为文件描述符中的STDIN_FILENO,读端
    dup2(pipefd[1], 1);  //1为文件描述符中的STDOUT_FILENO,写端
    此时,修该了原本从标准输入读取的变为从管道读取;原本从标准输出写入终端的变为写入管道中去
4. 由于管道内数据只能读取一次,因此,需要设置,当某个进程操作读端时关闭其写端;操作写端时关闭读端。
    避免被自身写入后自身读出管道内数据
5. 如果父子进程都需要发送和接收数据时,应该创建两根管道,一根用于父写子读,一根用于父读子写
  1. 兄弟进程间通信
1. 兄弟进程间通信时,父进程应关闭管道的读写两端,仅等待子进程结束并回收资源
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值