进程通信之管道通信

本文介绍了管道通信的基本概念,它是操作系统中一种用于进程间通信的方法。通过pipe()函数创建管道,并利用文件描述符进行读写操作。管道具有半双工特性,数据在同一时刻只能单向流动,且存在固定的缓冲区大小。提供的代码示例展示了父进程如何向管道写入数据,而子进程则从管道读取并输出数据。管道通信在具有血缘关系的进程间使用,不涉及文件系统。
摘要由CSDN通过智能技术生成

管道通信是常见的进程通信方式之一,其原理是借助操作系统,在内核区创建一块缓冲区,由两端的进程分别写入、读出数据。

创建管道的函数的原型:
int pipe(int filedes[2]);

其参数为一个大小为2的整形数组,在pipe()方法结束后,若管道创建成功,则该数组会被填入两个文件描述符,其中fd[0]默认为读端,fd[1]默认为写端。若创建失败,则返回值为-1。

管道通信特点:
(1)半双工,数据在同一时刻只能在一个方向上流动

(2)管道不是普通的文件,不属于某个文件系统,其只存在于内存中

(3)管道没有名字,只能在具有血缘关系的进程之间使用

(4)管道的缓冲区大小是有限的,在linux中,该缓冲区的大小固定为4k

代码示例:

#include<stdio.h>
#include<unistd.h>

void main() {
    int pid;
    int fd[2];
    int res;
    res = pipe(fd);
    char *msg = "hello pipe";
    char buffer[1024];
    if (res == -1) {
        perror("创建管道失败");
    }

    pid = fork();
    if (pid > 0) {
        // 父进程
        close(fd[0]);       //关闭读端
        write(fd[1], msg, 11);
        sleep(1);
        close(fd[1]);
    } else if (pid == 0) {
        // 子进程
        close(fd[1]);       //关闭写端
        res = read(fd[0], buffer, 11);
        write(STDOUT_FILENO, buffer, res);
        close(fd[0]);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值