一、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
喜欢的点赞加关注,星辰~念