实验七:进程间通信(一)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
管道和消息队列
●实验目的:
学会进程间通信方式:无名管道,有名管道,消息队列相关接口函数的使用
●实验要求:
(一)本实验首先创建管道,之后父进程使用fork()函数创建子进程,最后通过关闭父进程的读描述符fd[0]和子进程的写描述符fd[1]来建立一个"父进程写入,子进程读取"的管道,从而建立起它们之间的通信。
(二)本实验意在展示如何使用消息队列进行两个进程(发送端和接收端)之间的通信,包括消息队列的创建、消息发送与读取、消息队列的撤销和删除等多种操作。消息发送端进程和消息接收端进程不需要额外实现进程间的同步。在本实验中,发送端发送的消息类型设置为该进程的进程号(可以取其他值),因此接收端根据消息类型来确定消息发送者的进程号。
●实验器材:
软件:安装了Linux的vmware虚拟机
硬件:PC机一台
●实验步骤:
任务一:无名管道
1、编写实验代码pipe.c
#include
#include
#include
#include
#include
#include
int main()
{
int pipe_fd[2];
pid_t pid;
char buf[100];
const char data[]= "Pipe Test Program";
int r_num;
memset(buf,0,sizeof(buf));
/*创建管道*/
if(pipe(pipe_fd)<0)
{
printf("pipe create error\n");
return -1;
}
/*创建子进程*/
if((pid=fork())==0) //子进程执行代码
{
//1、子进程先关闭了管道的写端
close(pipe_fd[1]);
//2、让父进程先运行,这样父进程先写子进程才有内容读
sleep(3);
//3、读取管道的读端,并输出数据
if((r_num=read(pipe_fd[0],buf,100))>0)
printf("I am child progress.I have read %d bytes from the pipe:‘%s’\n",r_num,buf);
//4、关闭管道的读端,并退出
close(pipe_fd[0]);
exit(0);
}
else if(pid>0) //父进程执行代码
{
//1、父进程先关闭了管道的读端
close(pipe_fd[0]);
sleep(1);
//2、向管道写入字符串数据
if((r_num=write(pipe_fd[1],data,strlen(data)))!=-1)
printf("I am parent progress. I have worte %d bytes to the pipe:’%s’\n",r_num,data);
//3、关闭写端,并等待子进程结束后退出
close(pipe_fd[1]);
waitpid(pid,NULL,0);
exit(0);
}
return 0;
}
2、编译并运行应用程序
3、由于fork函数让子进程完整地拷贝了父进程的整个地址空间,所以父子进程都有管道的读端和写端。我们往往希望父子进程中的一个进程写一个进程读,那么写的进程最后关掉读端,读的进程最好关闭掉写端
任务二:消息队列
1、编写实验代码
msgrcv.c
#include
#include
#include
#include
#include
#include
#define TEXT_LEN 512
struct msg_st
{
long int msg_type;
char text[TEXT_LEN];
};
int main()
{
int msgid;
key_t key;
struct msg_st data;
//根据不同打路径和关键字产生标准的key
if((key = ftok(".", 'a')) == -1)
{
perror("ftok");
exit(-1);
}
//建立消息队列
msgid = msgget(key, 0666 | IPC_CREAT);
if(msgid == -1)
{
perror("msgget failed:");
exit(-1);
}
printf("open queue %d\n", msgid);
do
{
//从队列中获取消息
memset(data.text,0,TEXT_LEN);
if(msgrcv(msgid,&data, TEXT_LEN,0,0)<0)
{
perror("msgrcv");
exit(1);
}
printf("The message form process %ld : %s", data.msg_type, data.text);
}while(strncmp(data.text, "quit", 4));