一、实验内容:使用管道通信方式实现两个子进程分别向父进程发送消息
二、程序代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int p1,p2,fd[2];//
char buf[50],s[50];
//该函数是建立管道文件,并将文件描述词通过数组返回
//描述词 fd[0]的值:读端id; fd[1]的值:写端id
pipe(fd); //父进程建立管道
while((p1=fork())==-1); //创建子进程p1,直到成功
//fork()函数:返回值为0,返回到新创建的子进程。
//返回值>0,返回父进程或调用者。该值包含新创建的子进程的进程ID
if(p1==0){ //执行子进程p1
//对管道进行加、解锁
//值为1,对fd[1]加锁,0解锁
//第三个参数表示要加、解锁的连续字节数
//从当前文件位置开始,整数向前,负数向后,计数不计入当前位置
//0表示锁定当前位置到结尾区域
lockf(fd[1],1,0);
//将字符串写入缓冲区
//成功返回字符数,失败返回-1
sprintf(buf,"child process P1 is sending messages!\n");
//将buf代表的缓冲区中 50字节的数据 写入fd[1]代表的写端
//成功返回50,即字节数;失败返回-1
write(fd[1],buf,50);
//休眠
sleep(5);
lockf(fd[1],0,0);
exit(0); //关闭p1
}else{ //执行父进程
while((p2=fork())==-1); //创建子进程p2,直到成功
if(p2==0){ //执行子进程p2
lockf(fd[1],1,0);
//格式化字符串
sprintf(buf,"child process P2 is sending messages!\n");
write(fd[1],buf,50);
sleep(5);
lockf(fd[1],0,0);
exit(0); //关闭p2
}else{ //执行父进程
//wait()函数:回收僵尸进程
//父进程调用wait函数可以回收子进程终止信息。该函数有三个功能:
//阻塞等待子进程退出,回收子进程残留资源,获取子进程结束状态(退出原因)
wait(0); /*同步*/
read(fd[0],buf,50);
printf("%s\n",buf);
wait(0);
//从fd[0]代表的读端 读取50字节 保存在buf缓冲区
//之后,文件的当前读写指针向后移动50字节
read(fd[0],buf,50);
printf("%s\n",buf);
exit(0); //结束父进程
}
}
}
三、实验结果