南京信息工程大学 实验(实习)报告 实验(实习)名称 进程间通信 实验(实习)日期 20131130 得分 指导教师 系 计算机系 专业 计科 年级 2011 班次 1 姓名 汤建洋 学号 20112308018
1. 实验目的
Linux系统的进程通信机构(IPC)允许在任意进程间大批量地交换数据。本实验的目的是了解和熟悉Linux支持的消息通信机制、共享存储区和管道通信机制。
2. 实验准备
阅读Linux系统的msg.c、sem.c和shm.c等源码文件,熟悉Linux的三种通信机制。
3. 实验内容
⑴ 消息的创建、发送和接收。要求使用系统调用msgget ( ),msgsnd ( ),msgrev ( )及msgctl ( )编制长度为1K的消息的发送和接收程序,运行程序并观察结果,说明控制消息队列系统调用msgctl ( )在此起什么作用。
⑵ 共享存储区的创建、附接和断接。要求使用系统调用shmget ( ),shmat ( ),sgmdt ( ),shmctl ( ),编制一个与上述功能相同的程序。
⑶ 进程的管道通信。使用系统调用pipe ( )建立一条管道线,两个子进程P1和P2分别向管道各写一句话:
Child 1 is sending a message!
Child 2 is sending a message!
而父进程则从管道中读出来自于两个子进程的信息并显示在屏幕上,要求父进程先接收子进程P1发来的消息,然后再接收子进程P2发来的消息。
4. 实验指导
⑴ 消息的创建、发送和接收。
<程序设计>
为了便于操作和观察结果,用一个程序作为“引子”,先后fork ( )两个子进程SERVER和CLIENT进行通信,
SERVER端建立一个KEY为75的消息队列,等待其他进程发来的消息。当遇到类型为1的消息时,则作为结束信号,取消该队列并退出SERVER。SERVER每接收到一个消息后显示一句“( server) received”。
CLIENT端使用KEY为75的消息队列,先后发送类型从10到1的消息后退出。最后的一个消息即是SERVER端需要的结束信号。CLIENT每发送一条消息后显示一句“(client)sent”。
父进程在SERVER和CLIENT均退出后结束。
进程的管道通信。
<程序>
# include <unistd.h>
# include <stdio.h>
# include <signal.h>
int pid1, pid2;
main ( )
{ int fd [3];
char OutPipe [100], Inpipe [100];
pipe (fd);
while (pid1=fork ( ))= = -1);
if (pid1 = =0)
{
printf (“p1\n”);
lockf (fd[1], 1,0 );
sprintf ( OutPipe, “child 1 process is sending a message!”); write (fd [1], OutPipe, 50);
sleep (1);
lockf (fd [1], 0,0);
exit (0);
}
else
{
while (pid2=fork ( ))= = -1);
if (pid2 = =0)
{
printf (“p2\n”);
lockf (fd[1], 1,0 );
sprintf ( OutPipe, “child 2 process is sending a message!”); write (fd [1], OutPipe, 50);
sleep (1);
lockf (fd [1], 0,0);
exit (0);
}
}
else
{
printf (“parent \n”);
wait (0);
read (fd [0], InPipe, 50);
printf (“%s\n”, InPipe);
wait (0);
read (fd [0], InPipe, 50);
printf (“%s\n”, InPipe);
exit (0);
}
}
}
<运行结果>
tjy@ubuntu:~$ ./process5.o
p1
parent
p2
child 1 process is sending a message! child 2 process is sending a message!