Linux API-管道通信:pipe-建立无名管道、mkfifo-建立具名管道

一、pipe——建立管道

1.原函数

表头文件
#include "unistd.h"
定义函数
int pipe(int filedes[2]);

函数说明——建立无名管道,只能用于有亲缘关系的进程通信,管道中数据不存储,数据被读走后便丢失
filedes——filedes[0]为管道里的读取端,filedes[1]则为管道的写入端
返回值——成功返回零。失败返回-1,错误原因存于errno中

2.示例

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

int main()
{
        int pip[2];
        pid_t id;
        char data[30]={'\0'};
        char wdata[30]="Hello World";
        int len;

        pipe(pip);//建立无名管道

        id=fork();//创建子进程

        if(id>0)//父进程可进入执行代码
        {
                printf("This is father\n");
                memset(data,0,sizeof(data));
                close(pip[1]);//关闭写
                read(pip[0],data,sizeof(data));//打开读
                printf("father:data=%s\n",data);
                wait(NULL);//等待子进程退出
        }
        if(id==0)//子进程可进入执行代码
        {
                printf("This is son\n");
                memset(data,0,sizeof(data));
                close(pip[0]);//关闭读
                write(pip[1],wdata,sizeof(wdata));//打开写
                exit(3);//正常退出
        }

        return 0;
}

运行结果
This is father
This is son
father:data=Hello World

二、mkfifo——建立具名管道

1.原函数

表头文件
#include "sys/types.h" 
#include "sys/stat.h"
定义函数
int mkfifo(const char * pathname,mode_t mode);

函数说明——mkfifo()会依参数pathname建立特殊的FIFO文件,该文件必须不存在,而参数mode为该文件的权限,可以使用文件相关API对建立的FIFO文件进行操作
pathname——FIFO文件名
mode——此文件的权限,0600为可读可写
返回值——成功返回0。错误返回-1,错误原因存于errno中
说明——此文件的数据被读了一次则内容就会被读走了,可双向通信

2.示例
必须先运行先收后发,再运行先发后收
先收后发

#include <stdio.h>
#include "sys/types.h"
#include "sys/stat.h"
#include <fcntl.h>
#include<errno.h>

int main()
{
        int fd;
        char *wdata="Hello ";
        char rdata[30]={'\0'};

        if(mkfifo("./file",0600) == -1 && errno != EEXIST)//建立具名通信管道,权限可读可写
        {
                printf("make fifo defult\n");
                perror("why");
        }

        fd=open("./file",O_RDWR);//打开建立好的具名管道文件

        read(fd,rdata,sizeof(rdata));//向文件读操作
        printf("rdata=%s\n",rdata);

        sleep(1);

        write(fd,wdata,sizeof(wdata));//向文件写操作

        close(fd);//关闭文件

        return 0;
}

运行结果:rdata=World

先发后收

#include <stdio.h>
#include "sys/types.h"
#include "sys/stat.h"
#include <fcntl.h>
#include<errno.h>

int main()
{
        int fd;
        char *wdata="World ";
        char rdata[30]={'\0'};

        fd=open("./file",O_RDWR);//打开文件

        write(fd,wdata,sizeof(wdata));//先文件写操作

        sleep(2);

        read(fd,rdata,sizeof(rdata));//先文件读操作
        printf("rdata=%s\n",rdata);

        close(fd);//关闭文件

        return 0;
}

运行结果:rdata=Hello

喜欢的点赞加关注,星辰~念

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

星辰~念

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

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

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

打赏作者

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

抵扣说明:

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

余额充值