進(jìn)程間的通信_(tái)第1頁(yè)
進(jìn)程間的通信_(tái)第2頁(yè)
進(jìn)程間的通信_(tái)第3頁(yè)
進(jìn)程間的通信_(tái)第4頁(yè)
進(jìn)程間的通信_(tái)第5頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、進(jìn)程間通信(1)調(diào)試以下程序給出運(yùn)行結(jié)果并分析其程序原理:#include <stdio.h>#include <unistd.h>#include <wait.h>#include <signal.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>(1)編寫(xiě)兩個(gè)程實(shí)現(xiàn)進(jìn)程的無(wú)名管道和有名管道通信。要求分別調(diào)用pipe()、close()、write()、read()、popen()、p

2、close()、mknod()、mkfifo()、open()實(shí)現(xiàn)多個(gè)進(jìn)程間的通信。1.使用無(wú)名管道pipe(),進(jìn)行父子進(jìn)程之間的通信。編寫(xiě)的程序如下:運(yùn)行結(jié)果:2.以命名行為參數(shù)的管道文件的示例。(假設(shè)有一個(gè)可執(zhí)行程序chcase,從標(biāo)準(zhǔn)輸入設(shè)備讀字符,將小寫(xiě)字母轉(zhuǎn)化成大寫(xiě)字母并輸出。主程序使用popen創(chuàng)建管道,實(shí)現(xiàn)蔣某文本文件中的字幕轉(zhuǎn)化成大寫(xiě)字母,其中的文本文件名作為參數(shù)傳進(jìn)來(lái)。)Text.c文件 運(yùn)行結(jié)果:3.創(chuàng)建有名管道。運(yùn)行結(jié)果4.軟中斷機(jī)制#include<stdio.h>#include<signal.h>#include<unistd.h&g

3、t; void waiting(),stop(),alarming();int wait_mark;main()int p1,p2;if(p1=fork() /*創(chuàng)建子進(jìn)程p1*/if(p2=fork() /*創(chuàng)建子進(jìn)程p2*/wait_mark=1;signal(SIGINT,stop); /*接收到c信號(hào),轉(zhuǎn)stop*/signal(SIGALRM,alarming);/*接受SIGALRMwaiting();kill(p1,16); /*向p1發(fā)軟中斷信號(hào)16*/ kill(p2,17); /*向p2發(fā)軟中斷信號(hào)17*/ wait(0); /*同步*/wait(0);printf(&qu

4、ot;parent process is killed!n");exit(0); else wait_mark=1;signal(17,stop);signal(SIGINT,SIG_IGN); /*忽略 c信號(hào)*/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); /*忽略c信號(hào)*/while (wai

5、t_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;運(yùn)行結(jié)果:5.信號(hào)程序?qū)嵗c修正#include <stdio.h>#include <signal.h>#include <unistd.

6、h>void waiting( ),stop( );int wait_mark;main( )int p1,p2,stdout;while(p1=fork( )= =-1); /*創(chuàng)建子進(jìn)程p1*/if (p1>0) while(p2=fork( )= =-1); /*創(chuàng)建子進(jìn)程p2*/if(p2>0) wait_mark=1;signal(SIGINT,stop); /*接收到c信號(hào),轉(zhuǎn)stop*/waiting( );kill(p1,16); /*向p1發(fā)軟中斷信號(hào)16*/kill(p2,17); /*向p2發(fā)軟中斷信號(hào)17*/wait(0); /*同步*/wait(0)

7、;printf("Parent process is killed!n");exit(0); else wait_mark=1;signal(17,stop); /*接收到軟中斷信號(hào)17,轉(zhuǎn)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); /*接收到軟中斷信號(hào)16,轉(zhuǎn)stop*/waiting( );lockf(stdout

8、,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;運(yùn)行結(jié)果屏幕上無(wú)反應(yīng),按下C后,顯示 Parent process is killed!分析原因 思考1、 該程序段前面部分用了兩個(gè)wait(0),它們起什么作用? 用了兩個(gè)wait(0)的作用是父進(jìn)程等待兩個(gè)子進(jìn)程終止2、 該程序段中每個(gè)進(jìn)程退出時(shí)都用了語(yǔ)句exit(0),為什么? 用exit(

9、0)的作用是使子進(jìn)程實(shí)現(xiàn)正常終止,正常退出此次操作,返回。 3、 為何預(yù)期的結(jié)果并未顯示出? 因?yàn)橹粓?zhí)行成功兩個(gè)子進(jìn)程,但是并沒(méi)有調(diào)用兩個(gè)子進(jìn)程P1,P2。當(dāng)signal()讓父進(jìn)程捕捉從鍵盤(pán)上來(lái)的信號(hào)(按下C或者break鍵時(shí)),只有捕捉到信號(hào)后,父進(jìn)程用系統(tǒng)調(diào)用kill()向兩個(gè)子進(jìn)程發(fā)出信號(hào)。當(dāng)子進(jìn)程捕捉到信號(hào)后才能輸出信息,之后父進(jìn)程輸出信息。 4、(重點(diǎn))程序該如何修改才能得到正確結(jié)果?(實(shí)驗(yàn)報(bào)告中寫(xiě)出完整程序)#include <stdio.h>#include <unistd.h>#include <wait.h>#include <si

10、gnal.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>void waiting( ),stop( );int wait_mark;int main( )int p1,p2,stdout;while(p1=fork()=-1); /*創(chuàng)建子進(jìn)程p1*/if (p1>0) while(p2=fork()=-1); /*創(chuàng)建子進(jìn)程p2*/if(p2>0) wait_mark=1;signal(SIGINT,stop)

11、; /*接收到c信號(hào),轉(zhuǎn)stop*/waiting();kill(p1,16); /*向p1發(fā)軟中斷信號(hào)16*/kill(p2,17); /*向p2發(fā)軟中斷信號(hào)17*/wait(0); /*同步*/wait(0);printf("Parent process is killed!n");exit(0); else wait_mark=1;signal(17,stop); /*接收到軟中斷信號(hào)17,轉(zhuǎn)stop*/signal(SIGINT,SIG_IGN);/修改處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); /*接收到軟中斷信號(hào)16,轉(zhuǎn)stop*/signal(SIGINT,SIG_IGN);/修改處waiting();lockf(stdout,1,0);

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論