内蒙古工业大学数据科学与应用学院
【举例2】
在上面任务1中,增加语句signal(SIGINT,SIG_IGN)和语句signal(SIGQUIT,SIG_IGN),观察执行结果,并分析原因。这里signal(SIGINT,SIG_IGN)和signal(SIGQUIT,SIG_IGN)分别为忽略“Ctrl+c”键信号以及忽略中断信号。 【程序】
#include
int pid1,pid2;
int endflag=0,pf1=0,pf2=0;
void intdelete() {
kill(pid1,16); kill(pid2,17); endflag=1; } void int1() {
printf(“child process 1 is killed by parent!”); exit(0); } void int2() {
printf(“child process 2 is killed by parent!”); exit(0); }
main() {
第页
内蒙古工业大学数据科学与应用学院
int exitpid;
signal(SIGINT,SIG_IGN); signal(SIGQUIT,SIG_IGN); while((pid1=fork())= =-1); if(pid1= =0) {
printf(“process 1 run!\\n”); signal(SIGUSR1,int1); signal(16, SIG_IGN); pause(); exit(0); } else {
while((pid2=fork())= =-1); if(pid2= =0) {
printf(“process 2 run!\\n”); signal(SIGUSR2,int2); signal(17, SIG_IGN); pause(); exit(0); } else {
printf(“parent run!\\n”); signal(SIGINT,intdelete); waitpid(-1,&exitpid,0);
printf(“parent process is killed!\\n”); exit(0); } }
第页
内蒙古工业大学数据科学与应用学院
}
2.进程的管道通信 【举例】
编制一段程序,实现进程的管道通信。使用系统调用pipe()建立一条管道线。两个子进程p1和p2分别向管道各写一句话: child 1 is sending a message! child 2 is sending a message!
而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。 【程序】
#include
int pid1,pid2; main() {
int fd[3];
char outpipe[100],inpipe[100]; pipe(fd);
while((pid1=fork())= =-1); if(pid1= =0) {
printf(“p1 run!\\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 run!\\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 run!\\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); } } }
3.进程的消息队列通信 实验要求:
(1)实现客户机与服务器之间的通信程序。
1)基本要求:实现1台客户机对1台服务器;提高要求:实现n台客户机对1台服务器; 2)要求服务器分别接收客户机数据。
3)要求每个客户机与服务器采用消息队列通信机制来发送和接收消息。
(2)测试程序,给出测试结果并进行分析。
第 页
内蒙古工业大学数据科学与应用学院
(3)书写预习报告和实验报告。
实验提示:
进程间消息队列通信主要用到的四个系统调用如下: int msgget(key_t key,int msgflg)
int msgctl(int msgqid,int cmd,struct msqid_ds *buf)
int msgsnd(int msgqid,struct msgbuf *msgp, size_t msgsz,int msgflg)
int msgrcv(int msgqid,struct msgbuf *msgp, size_t msgsz,long msgtyp,int msgflg) 包含的头文件如下: #include
编制一个客户机进程,定义消息的格式,使用msgget()系统调用创建消息队列,使用msgsnd()和msgrcv()系统调用实现与服务进程之间消息的发送和接收,通信结束后使用msgctl()系统调用删除相关的消息队列。
(1)客户机程序设计 #include
printf(\ struct msgform msg; int msgqid,pid;
msgqid=msgget(MSGKEY,0777); pid=getpid(); char*pint=msg.mtext;
第 页