更多资料请点击:我的目录
本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢。
本篇记录应用有名管道FIFO,进行双进程的“双向通信”,并当某一方收到/发送“quit”马上结束通信,具体代码如下:
进程一:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
int main()
{
int ret;
if(access("/home/gec/jiajia/1.txt",F_OK)) //判断文件是否存在,固定参数F_OK
{
ret = mkfifo("/home/gec/jiajia/1.txt",0666); //不存在则创建
if(ret == -1)
{
perror("创建有名管道失败!\n");
return -1;
}
}
int fifo1 = open("/home/gec/jiajia/1.txt",O_RDWR); //存在就直接打开
if(fifo1 == -1)
{
perror("打开有名管道1失败!\n");
return -1;
}
if(access("/home/gec/jiajia/2.txt",F_OK)) //判断文件是否存在,固定参数F_OK
{
ret = mkfifo("/home/gec/jiajia/2.txt",0666); //不存在则创建
if(ret == -1)
{
perror("创建有名管道失败!\n");
return -1;
}
}
int fifo2 = open("/home/gec/jiajia/2.txt",O_RDWR); //存在就直接打开
if(fifo2 == -1)
{
perror("打开有名管道2失败!\n");
return -1;
}
char buf[50];
while(1)
{
bzero(buf,50);
printf("输入:");
scanf("%s",buf);
write(fifo1, buf ,50); //从有名管道1中写入内容
bzero(buf,50);
read(fifo2, buf ,50); //从有名管道2中读取内容
if(strcmp(buf,"quit")==0) //判断是否接受到quit
{
write(fifo1, buf ,50); //从有名管道1中写入内容
break;
}
printf("输出:%s\n",buf);
}
close(fifo1); //关闭有名管道1文件
close(fifo2); //关闭有名管道2文件
return 0;
}
进程二
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
int main()
{
int ret;
if(access("/home/gec/jiajia/1.txt",F_OK)) //判断文件是否存在,固定参数F_OK
{
ret = mkfifo("/home/gec/jiajia/1.txt",0666); //不存在则创建
if(ret == -1)
{
perror("创建有名管道失败!\n");
return -1;
}
}
int fifo1 = open("/home/gec/jiajia/1.txt",O_RDWR); //存在就直接打开
if(fifo1 == -1)
{
perror("打开有名管道1失败!\n");
return -1;
}
if(access("/home/gec/jiajia/2.txt",F_OK)) //判断文件是否存在,固定参数F_OK
{
ret = mkfifo("/home/gec/jiajia/2.txt",0666); //不存在则创建
if(ret == -1)
{
perror("创建有名管道失败!\n");
return -1;
}
}
int fifo2 = open("/home/gec/jiajia/2.txt",O_RDWR); //存在就直接打开
if(fifo2 == -1)
{
perror("打开有名管道2失败!\n");
return -1;
}
char buf[50];
while(1)
{
bzero(buf,50);
read(fifo1, buf ,50); //从有名管道1中读取内容
if(strcmp(buf,"quit")==0) //判断是否接受到quit
{
write(fifo2, buf ,50); //从有名管道2中写入内容
break;
}
printf("输出:%s\n",buf);
bzero(buf,50);
printf("输入:");
scanf("%s",buf);
write(fifo2, buf ,50); //从有名管道2中写入内容
}
close(fifo1); //关闭有名管道1文件
close(fifo2); //关闭有名管道2文件
return 0;
}
运行结果: