管道通信

管道通信总结

管道通信的特点

  • 管道是半双工的,先进先出的,它把一个进程的输出和另一个进程的输入连接在一起
  • 一个进程(写进程)在管道的尾部写入数据,另一个进程(读进程)从管道的头部读出数据

无名管道和有名管道分别适用的进程

  • 无名管道用于 父子进程之间 的通信
  • 有名管道用于 运行同一个系统中的任意两个进程间 的通信

无名管道和有名管道创建的步骤

  • 无名管道:创建管道——读管道——写管道——关闭管道
  • 有名管道:创建管道——删除管道——打开管道——关闭管道——读管道——写管道
    管道用于不同进程间的通信,通常先创建一个管道,在通过fork函数创建一个子进程,该子进程会继承父进程所创建的管道

管道通信函数

int pipe(int filedes[2])

  • 参数:新建的两个描述符由filedes数组返回。
  • filedes[0]表示管道的读取端,filedes[1]表示管道的写入端
  • 返回值:成功:0;出错:-1
  • 头文件:#include<unistd.h>

无名管道

#include <stdlib.h>
#include <stdio.h>
#include <zconf.h>
#include <cstring>

int main() {

    // 创建无名管道
    int fd[2];
    if (pipe(fd) == -1)
        exit(1);

    // 管道传递信息
    char msgSend[] = "我在写呢";
    char msgRecv[32];

    int pid = fork();

    if (pid == 0) {
        // 子进程
        close(fd[1]); // 关闭管道写入端,准备读
        printf("before read data from pipe!\n");
        read(fd[0], msgRecv, strlen(msgSend)); // 把信息读入msgRecv
        printf("read [%s] from pipe\n", msgRecv);
    } else {
        // 父进程
        close(fd[0]); // 关闭管道读取端,准备写
        printf("Parent sleeping ......\n");
        sleep(3); // 迫使子进程先执行
        printf("Parent wake up !\n");
        write(fd[1], msgSend, strlen(msgSend));
        wait(0);
    }
    exit(0);
}

运行结果

Parent sleeping ......
before read data from pipe!  // 等待3s
Parent wake up !
read [我在写呢] from pipe

Process finished with exit code 0

有名管道

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容