实验目的
- 了解进程间通信原理
- 了解进程间通信的方式
- 掌握进程间通信(有名管道)
实验内容
- 创建一个有名管道文件——fifo
- 创建两个.c文件,分别作为读端与写端
- 在写端输入内容,读端要做出反应,将写入的内容打印出来
实验原理
- 有名管道,通常被称为“FIFO文件”或“命名管道”,通常用于不相关的进程间的通信(任意两个进程间的通信),它是一种特殊的文件,在文件系统中以文件名的形式存在,可以在命令行上用“mkfifo fifo”创建一个名为“fifo”的有名管道。
- 写端和读端:一个管道文件,需要两个进程,一个读称为“读端”,一个写称为“写端”。
- 第一步:先创建一个有名管道文件——fifo,两个.c文件——write.c和read.c(分别对这个管道文件进行“读”和“写”)。
第二步:在write.c中,以“只读”的形式打开有名管道文件“fifo”,打印打开fifo文件得到的文件描述符——fw,然后不断地将从标准输入——stdin中的内容放入数组——buff中,将buff中的内容write写入与文件描述符fw有关的文件“fifo”中,并且当buff中的前三个字符为“end”时,停止从标准输入中读取内容,直接关闭写端。
第三步:在read.c中,以“只读”的形式打开管道文件“fifo”,打印得到的文件描述符——fr,然后将从文件“fifo”中读取的内容放入数组——buff中,再打印到标准输出中,如果读“fifo”时再没有什么数据可读(即写端没有再往文件“fifo”中写入内容),则打印“对方(写端)已关闭”,再跳出关闭读端。
程序设计
read.c
#include"stdio.h"
#include"stdlib.h"
#include"assert.h"
#include"string.h"
#include"unistd.h"
#include"fcntl.h"
int main()
{
int fr=open("fifo",O_RDONLY);
assert(fr!=-1);
while(1)
{
char buff[128]={0};
int n = read(fr,buff,127);
if(n == 0)
{
printf("对方已关闭\n");
break;
}
printf("read(n=%d):%s",n,buff);
}
close(fr);
exit(0);
}
write.c
#include"stdio.h"
#include"stdlib.h"
#include"assert.h"
#include"unistd.h"
#include"string.h"
#include"fcntl.h"
#include"signal.h"
#include"sys/types.h"
#include"sys/stat.h"
int main()
{
int info = mkfifo("fifo",0666);
int fw = open("fifo",O_WRONLY);
assert(fw != -1);
while(1)
{
char buff[128]={0};
fgets(buff,128,stdin);
if(strncmp(buff,"end",3) ==0)
{
break;
}
write(fw,buff,strlen(buff));
}
close(fw);
exit(0);
}
运行结果
实验总结
当写端关闭时,读端会做出反应,输出“对方已关闭”后结束读端进程,而当读端关闭时,写端也会对应关闭来减少无效的输入。