实验七:进程间通信(一)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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));

相关文档
最新文档