进程间通信(有名管道)编程实验

进程间通信(有名管道)编程实验

实验目的

  1. 了解进程间通信原理
  2. 了解进程间通信的方式
  3. 掌握进程间通信(有名管道)

实验内容

  1. 创建一个有名管道文件——fifo
  2. 创建两个.c文件,分别作为读端与写端
  3. 在写端输入内容,读端要做出反应,将写入的内容打印出来

实验原理

  1. 有名管道,通常被称为“FIFO文件”或“命名管道”,通常用于不相关的进程间的通信(任意两个进程间的通信),它是一种特殊的文件,在文件系统中以文件名的形式存在,可以在命令行上用“mkfifo fifo”创建一个名为“fifo”的有名管道。
  2. 写端和读端:一个管道文件,需要两个进程,一个读称为“读端”,一个写称为“写端”。
  3. 第一步:先创建一个有名管道文件——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);
}

运行结果

在这里插入图片描述
在这里插入图片描述

实验总结

当写端关闭时,读端会做出反应,输出“对方已关闭”后结束读端进程,而当读端关闭时,写端也会对应关闭来减少无效的输入。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值