概述
这个实验会建立一个全双工系统(Full-Duplex),实现两个管道同时收发消息。在程序中会涉及到3个文件,2个管道,2个进程,4个线程。线程之间的拓扑图如下:
【完整代码附在文章最后】
创建连通管道
首先创建fifo_create.c
文件来事先创建2个管道,分别为A发送B接收、A接收B发送。使用mkfifo()
语句创建管道,分别标识为“A2B”、“B2A”。
访问权限为0644
,第一位0不算,从左至右三个数字分别代表rw-
r--
r--
对应转化为的二进制110
100
100
。十进制第1个数字代表文件所有者的权限,十进制第2个数字代表同组用户的权限,十进制第3个数字代表其他用户的权限。
之后验证mkfifo()
的返回值,验证管道是否创建成功。如果创建成功,当前目录下回多出来“A2B”、“B2A”两个文件。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(){
int A2B = mkfifo("A2B", 0644);
int B2A = mkfifo("B2A", 0644);
if (A2B == -1)
printf("Falled to create the FIFO of A2B!n");
if (B2A == -1)
printf("Falled to create the FIFO of B2A!n");
return 0;
}
创建2个进程4个线程
连接标记符
创建A.c
和B.c
两个文件,在两个文件中均创建send
和receive
两个线程。因为两个文件类似,这里以A.c
为例,B.c
同理。
在A.c
中首先定义一个全局变量,用来标记两个管道是否连接,如果均连接成功,则flag=1
,有任意一个管道断开则flag=0
。
//全局变量,标记是否连接,两个管道中有一个断开,则flag变为0
int flag = 1;
发送消息
通过send
函数实现发送消息。在管道连通之前,即在open
语句等待管道连通。这里open
语句使用只写的方式进行打开,如果管道连接成功,程序继续向下运行。
定义一个循环进行消息的多次发送,使用fgets()
语句从指定的标准输入流stdin
中读取一行,并把它存储在buf
所指向的字符串内,多余的长度使用