我们在使用有名管道的时候需要创建管道节点,通过mkdifo函数,创建成功并不会马上在Linux内核中生成管道,只有通过open函数打开节点以后才会有管道在Linux内核中生成
我们可以通过终端命令或者通过代码创建有名管道文件
mkfifo 路径+文件名
通过代码创建fifo管道的代码如下:
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
int main()
{
int ret=mkfifo("./myfifo",0777);
if(ret!=0){
exit(1);
printf("mkfifo faile !\n");
}
printf("mkfifo success !\n");
return 0;
}
这样就创建了管道文件
下面我们通过两个进程来验证有名通道的通信
进程1:
#include"stdio.h"
#include"sys/types.h"
#include"stdlib.h"
#include <fcntl.h>
#include <unistd.h>
int main()
{
int fd=open("./myfifo",O_RDWR);
int process_inter=0;
int i=0;
for(;i<5;i++)
{
printf("\nI am process 1 ! %d\n",i);
}
sleep(5);
process_inter=1;
write(fd,&process_inter,sizeof(process_inter));
while(1);
return 0;
}
p2.c:
#include"stdio.h"
#include"sys/types.h"
#include"stdlib.h"
#include <fcntl.h>
#include <unistd.h>
int main()
{
int fd=open("./myfifo",O_RDWR);
int process_inter=0;
read(fd,&process_inter,1);
int i=0;
while(process_inter==0);
for(;i<5;i++)
{
printf("\nI am process 2 ! %d\n",i);
}
while(1);
return 0;
}
当p1运行5秒后,才会通知p2去运行,结果与之前的无名管道没有什么不同
只是现在是两个没有血缘关系的进程进行通信,这样就做到了无名管道的改进,通过对管道文件的操作实现进程通信的同步!