资源预览内容
第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
第9页 / 共12页
第10页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
进程间通信(1)调试以下程序给出运行结果并分析其程序原理:#include #include #include #include #include #include #include #include (1)编写两个程实现进程的无名管道和有名管道通信。要求分别调用pipe()、close()、write()、read()、popen()、pclose()、mknod()、mkfifo()、open()实现多个进程间的通信。1.使用无名管道pipe(),进行父子进程之间的通信。编写的程序如下:fork函数执行完毕后,返回值pid0,则运行父进程,关闭读操作,进行写操作,将信息写进管道,写完后关闭写操作,父进程挂起。Pid=0,运行子程序,关闭写操作,进行读操作,读完信息关闭读操作,子进程运行结束,父进程继续运行。2.以命名行为参数的管道文件的示例。(假设有一个可执行程序chcase,从标准输入设备读字符,将小写字母转化成大写字母并输出。主程序使用popen创建管道,实现蒋某文本文件中的字幕转化成大写字母,其中的文本文件名作为参数传进来。)命令行数量不为2时,输出结果如图所示;创建一个可执行程序chcase,此程序从标准输入设备读字符,将小写字母转化成大写字母并输出。主程序使用popen()创建一个管道。再创建一个文本文件,输入将要转换成大写字母的小写字母。Popen创建的管道一头与文本文件相连,获取文本文件中的信息,将此信息通过管道传送给与管道另一端相连的可执行程序chcase,chcase获取文本文件中的小写字母后,将小写字母转换成大写字母输出。3. 创建有名管道。当输入命令行数量为2时,打开管道,只进行写操作。不为2时,打开管道,只进行读操作。且均循环26次。4.软中断机制#include#include#include void waiting(),stop(),alarming();int wait_mark;main()int p1,p2;if(p1=fork() if(p2=fork()wait_mark=1;signal(SIGINT,stop); signal(SIGALRM,alarming);waiting();kill(p1,16); kill(p2,17); wait(0); wait(0);printf(parent process is killed!n);exit(0); else wait_mark=1;signal(17,stop);signal(SIGINT,SIG_IGN); while (wait_mark!=0);lockf(1,1,0);printf(child process2 is killed by parent!n);lockf(1,0,0);exit(0);elsewait_mark=1;signal(16,stop);signal(SIGINT,SIG_IGN); while (wait_mark!=0)lockf(1,1,0);printf(child process1 is killed by parent!n);lockf(1,0,0);exit(0);void waiting()sleep(5);if (wait_mark!=0) kill(getpid(),SIGALRM);void alarming()wait_mark=0;void stop()wait_mark=0;程序调用fork()函数创建两个子进程,开始两个子进程处于等待状态。singal()函数让父进程获取中断信号C;当父进程获取该中断信号后,父进程调用Kill()函数向两个子进程发出信号,该信号的作用是让子进程从等待状态转为执行状态,子进程捕捉到该信号后分别执行各自的程序。两个子进程执行完成后,父进程收到相应信号后,执行程序。5.信号程序实例与修正#include #include #include void waiting( ),stop( );int wait_mark;main( )int p1,p2,stdout;while(p1=fork( )=-1); /*创建子进程p1*/if (p10) while(p2=fork( )=-1); /*创建子进程p2*/if(p20) wait_mark=1;signal(SIGINT,stop); /*接收到c信号,转stop*/waiting( );kill(p1,16); /*向p1发软中断信号16*/kill(p2,17); /*向p2发软中断信号17*/wait(0); /*同步*/wait(0);printf(Parent process is killed!n);exit(0); else wait_mark=1;signal(17,stop); /*接收到软中断信号17,转stop*/waiting( );lockf(stdout,1,0);printf(Child process 2 is killed by parent!n);lockf(stdout,0,0);exit(0);elsewait_mark=1;signal(16,stop); /*接收到软中断信号16,转stop*/waiting( );lockf(stdout,1,0);printf(Child process 1 is killed by parent!n);lockf(stdout,0,0);exit(0); void waiting( ) while(wait_mark!=0);void stop( )wait_mark=0;运行结果屏幕上无反应,按下C后,显示 Parent process is killed!分析原因在while语句里,那么当创建失败之后,如果在while里面没有break或者跳出,当while执行体执行结束后又会执行(p1=fork()=-1,等于不断重复创建子进程一直到创建成功为止没有成功调用两个子进程P1,P2。当signal()让父进程获取从C信号,只有捕捉到信号后,父进程用系统调用kill()向两个子进程发出信号。当子进程捕捉到信号后才能输出信息,之后父进程输出信息。思考1、 该程序段前面部分用了两个wait(0),它们起什么作用? 答:使子进程P1和P2同时发出软中断信号。2、该程序段中每个进程退出时都用了语句exit(0),为什么?3、为何预期的结果并未显示出?答:没有成功调用两个子进程P1,P2。当signal()让父进程获取从C信号,只有捕捉到信号后,父进程用系统调用kill()向两个子进程发出信号。当子进程捕捉到信号后才能输出信息,之后父进程输出信息。4、(重点)程序该如何修改才能得到正确结果?(实验报告中写出完整程序)#include #include #include void waiting( ),stop( );int wait_mark;main( )int p1,p2,stdout;while(p1=fork( )= =-1); /*创建子进程p1*/if (p10) while(p2=fork( )= =-1); /*创建子进程p2*/if(p20) wait_mark=1;signal(SIGINT,stop); /*接收到c信号,转stop*/waiting( );kill(p1,16); /*向p1发软中断信号16*/kill(p2,17); /*向p2发软中断信号17*/wait(0); /*同步*/wait(0);printf(Parent process is killed!n);exit(0); else wait_mark=1;signal(17,stop); /*接收到软中断信号17,转stop*/signal(SIGALRM,alarming);waiting( );lockf(stdout,1,0);printf(Child process 2 is killed by parent!n);lockf(stdout,0,0);exit(0);elsewait_mark=1;signal(16,stop); /*接收到软中断信号16,转stop*/waiting( );lockf(stdout,1,0);printf(Child process 1 is killed by parent!n);lockf(stdout,0,0);exit(0); void waiting( ) sleep(5); if(wait_mark!=0); kill(getpid(),SIGALRM); void stop( )wait_mark=0; void alarming() wait_mark=0;5、*不修改程序如何得到期望的输出?不做任何操作等待五秒钟父进程会在子进程先退出后退出,并打印退出顺序
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号