三、实验内容
编写一段程序,使用管道来实现父子进程之间的进程通信。子进程项父进程发送自己的进程表示符,以及某字符串。父进程则通过管道读出子进程发来的消息,将消息显示在屏幕上,然后终止。
四、程序设计-源程序
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
int fpid;//用于记录fork()返回值
int fd[2];//用于记录pipe文件的读写端
int ret_pipe;//用于接收pipe()的返回值
ret_pipe=pipe(fd);
if(ret_pipe==-1)
{
//创建管道失败
exit(1);
}
//创建管道成功之后执行以下代码:
fpid=fork();
if(fpid<0)//创建子进程失败
{
exit(1);
}
else if(fpid==0)//子进程执行代码
{
lockf(fd[1],1,0);//锁上写端
char w_buffer[1024];
int len=sprintf(w_buffer,"Write by Child Process,my id:%d\n",getpid());
write(fd[1],w_buffer,len*sizeof(char));
lockf(fd[1],0,0);//解锁写端
exit(0);
}
else//父进程执行代码
{
sleep(3);//确保子进程先写再读
lockf(fd[0],1,0);//锁上读端
char r_buffer[1024];
read(fd[0],r_buffer,sizeof(r_buffer));
lockf(fd[0],0,0);//解锁读端
waitpid(fpid,NULL,0);//等待子进程完结
printf("Parent Process read form pipe:%s",r_buffer);
exit(0);
}
}
五、程序调试
一开始编写程序的时候用的是close(fd[1]);或者是close(fd[0]);作用是关闭了读写端,lockf()函数与之比较起来更加灵活,lockf函数并不是关闭读写端而是锁起来,达到