进程间通信之管道pipe

管道用于具有亲缘关系的进程之间的通信,又称匿名管道,以与命名管道区分。
通过管道的通信数据遵循“先进先出”原则,并且是单向通信,因此若有两个进程需要双向通信,则至少需要建立两个管道。
“具有亲缘关系的进程”是指父进程与子进程,或者父进程派生的2个子进程。
下面就直接上代码演示两个兄弟进程之间通过匿名管道传递数据:

#include <stdio.h>
int main()
{
    int fdset[2];
    int id;

    if(-1 == pipe(fdset))
    {
        perror("pipe error\n");
        return 0;
    }

    if(!fork())
    {
        id = getpid();
        printf("I am child writer pid:%d parent:%d\n", id, getppid());
        write(fdset[1], &id, sizeof(int));
    }
    else if(!fork())
    {
        read(fdset[0], &id, sizeof(int));
        printf("I am child reader pid:%d parent:%d. My brother pid:%d\n", 
                    getpid(), getppid(), id);
    }
    else
    {
        printf("I am parent pid:%d\n", getpid());
    }
    sleep(2);
    close(fdset[0]);
    close(fdset[1]);

    printf("Bye from pid:%d\n", getpid());
    return 0;
}

来看一下运行结果:

test@test:~$ gcc main.c 
test@test:~$ ./a.out 
I am parent pid:25192
I am child writer pid:25193 parent:25192
I am child reader pid:25194 parent:25192. My brother pid:25193
Bye from pid:25192
Bye from pid:25193
Bye from pid:25194

和代码对应起来一起看:
父进程进程号是25192,派生了2个进程,一个往pipe中写入自己的进程号,另外一个子进程从pipe中读出兄弟进程的进程号,并打印出来。
只有具有亲缘关系的进程才能通过fork共享文件打开表,而不同进程打开文件表最终指向的是同一个系统文件打开表,才实现了数据流的传递。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yilonglucky

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值