Linux程序设计之匿名管道

  1. 匿名管道:匿名管道是具有关系的进程之间的通信方式,比如父子进程、兄弟进程等等。匿名管道需要输出一个数组。此数组是输出参数。在此数组中会分别保存管道读写端的文件描述符(在Linux中一切皆文件)。

  1. 使用方法:使用pipe(int pipepid[2])函数来创建管道。管道创建成功时返回0,否则返回-1,并设置对应的错误编号。输出参数pipepid[0]是管道读端的文件描述符,pipepid[1]是管道写端的文件描述符。对于文件,可以使用文件操作函数read和write函数来写入和读取数据。

  1. 程序设计:父子进程之间利用匿名管道进行通信的代码如下:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    //创建匿名管道,注意匿名管道只能在具有关系的进程之间进行通信,比如父子进程,兄弟进程等等
    int pipepid[2];

    /*pipepid为输出参数,也就是在pipe函数中会给pipepid两个值,分别为管道的读、写端口。
    在Linux中,一切皆文件,所以pipe赋值个pipepid的是管道文件的读写端的文件描述符*/
    int res=pipe(pipepid);  
    if(res==-1)
    {
        perror("pipe");
        exit(0);    //退出进程
    }

    //创建子进程
    pid_t ret=fork();
    if(ret > 0)
    {
        printf("i am parent,pid=%d\n",getpid());
        //父进程
       while(1)
       {

            char buf1[1024]={0};
            char *parent="hello child";
            write(pipepid[1],parent,strlen(parent));
            sleep(1);
            
            int len1=read(pipepid[0],buf1,sizeof(buf1));
            printf("parnt receive:%s,pid=%d\n",buf1,getpid());

            sleep(1);
       }

    }
    else if(ret == 0)
    {
        printf("i am child,pid=%d\n",getpid());
        char child[1024]={0};
        //子进程
        while (1)
        {
            int len=read(pipepid[0],child,sizeof(child));
            printf("child receive:%s, pid=%d \n",child,getpid());

            char *chidl1="hello parent";
            write(pipepid[1],chidl1,strlen(chidl1));

            sleep(1);
        }
        
    }

    return 0;
}
  1. 运行结果:

  1. 总结:

匿名管道是具有关系的进程之间的一种通信方式。对于管道文件的操作同其他的普通文件的操作一样,比如read和write。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值