(3)答:父进程为子进程收尸,防止僵尸程序出现。 (4)答:在调用处强行退出程序,运行一次程序就结束。 (三)进程的管道通信实验 (四)【实验内容】
1.编制一段程序,实现进程的管道通信。使用pipe()建立一条管道线。两个子进程p1和p2分别向管道各写一句话:
Child 1 is sending message! Child 2 is sending message!
而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。 实验要求:运行程序并分析结果。
2.在父进程中用pipe()建立一条管道线,往管道里写一句话,两个子进程接收这句话。 定义缓冲区,创建管道,随后创建进程,将父进程的消息写进缓冲去写进管道再传给写进子进程,子进程接受。
定义一个管道,父进程传递消息到管道,随后创建两个子进程接收这个消息,然后结束进程。 实验小结:再这个实验中一开始打算将两个子进程分开判断,但是常常最后出现结果不是出现僵尸进程就是跳过其中一个子进程结束,最后我觉得既然两个进程同时创建,不如直接将他们一起进行判断。
(四)消息的发送与接收实验
【实验内容】
1.消息的创建、发送和接收。使用系统调用msgget( ),msgsnd( ),msgrev( ),及msgctl( )编制一长度为1k的消息发送和接收的程序。 <参考程序> ①client.c
#include
char mtext[1000]; }msg;
int msgqid;
void client() {
int i;
msgqid=msgget(MSGKEY,0777); for(i=10;i>=1;i--) {
msg.mtype=i;
printf(“(client)sent\\n”); msgsnd(msgqid,&msg,1024,0); }
exit(0); }
main( ) {
client( ); }
②server.c
#include
char mtext[1000]; }msg;
int msgqid;
void server( ) {
msgqid=msgget(MSGKEY,0777|IPC_CREAT); do
{msgrcv(msgqid,&msg,1030,0,0); printf(“(server)received\\n”);
}while(msg.mtype!=1); msgctl(msgqid,IPC_RMID,0); exit(0); }
main( )
{ server( ); }
1.列出调试通过程序的清单,分析运行结果。
首先运行client.c创建打开消息队列75,往消息对列中传递消息10-1,然后运行serve.c, 打开消息队列75,然后接收其中的消息直到消息为假(不存在),退出进程。 2.给出必要的程序设计思路和方法(或列出流程图)。
先后fork两个子进程,server和client,进行通信。Server端建立一个key为75的消息队列,等待其他进程发来的消息。当遇到类型为1的消息,则作为结束的信号,取消该队列,并退出server。Server每接受到一个消息后显示一句“(server)received”。
3.总结上机调试过程中所遇到的问题和解决方法及感想。 无法做到同步,再client进程全部发送完成后,serve进程才开始进行接收消息并打印,按照常理来说应该是发消息接消息的,试了其他办法却老是出现僵尸进程。