作業系統實驗2
阿新 • • 發佈:2021-11-09
Linux程序的軟中斷通訊與管道通訊
1)軟中斷通訊
編制一段程式並適當加以註釋,實現軟中斷通訊:在系統中呼叫signal()讓父程序捕捉鍵盤上來的Ctrl+C中斷訊號實現父程序中斷;父程序呼叫fork()函式建立兩個子程序,休眠10秒鐘後,父程序呼叫kill()函式向兩個子程序分別傳送整數值為17和17的軟中斷訊號,各子程序獲得對應訊號後,分別輸出下列資訊後終止:
Child process 1 is killed by parent !
Child process 2 is killed by parent !
父程序再呼叫wait()函式等待兩個子程序終止後,輸出以下資訊後終止:
Parent process is killed!!
多執行幾次編寫的程式,簡略分析出現不同結果的原因。
程式碼如下
#include <stdio.h> #include <signal.h> #include <unistd.h> #include <sys/types.h> int wait_flag; void stop(); main(){ int pid1,pid2; signal(SIGINT,stop); while((pid1=fork())==-1);/*建立子程序pid1*/ if(pid1>0){ /* 子程序pid程式碼*/ printf("\n I am the parent process,my pid is: %d \n",getpid());//輸出父程序 while((pid2=fork())==-1);//建立子程序pid 2成功 if(pid2>0){/*子程序pid1程式碼*/ wait_flag=1; printf("\n I am sleeping for 10s\n"); sleep(10);/*子程序pid1休眠10S */ kill(pid1,17);//向子程序pid 1 發出訊號17 kill(pid2,17);//向子程序pid 2 發出訊號17 int kpid1=wait(0);//等待pid1 的子程序 pid 2的結束符號 printf("\n child process has ended %d \n",kpid1); int kpid2=wait(0); printf("\n child process has ended %d \n",kpid2); printf("\n Parent process is killed!!\n"); exit(0); } else{/*子程序 */ printf("\n I am the child process2,my pid is:%d\n",getpid()); wait_flag=1; signal(17,stop);//如接收到訊號17,則執行stop函式 while(1){ /*若執行了stop 函式,wait_flag會變成 0,則子程序結束*/ if(wait_flag==0){ printf("\n Child process2 is killed by parent!!\n"); exit(0); } } } } else{ printf("\n I am the child process1,my pid is:%d\n",getpid()); wait_flag=1; signal(17,stop);//如接收到訊號17,則執行stop函式 while(1){ /*若執行了stop 函式,wait_flag會變成 0,則子程序結束*/ if(wait_flag==0){ printf("\n Child process1 is killed by parent!!\n"); exit(0); } } } } void stop(){//訊號執行控制代碼函式 printf("\n stop() is called\n"); wait_flag=0;//若執行此函式,可以讓全域性變數wait_flag的值變為0 }
執行後截圖:
2)管道通訊
編制一段程式並適當加以註釋,實現程序的管道通訊: 使用系統呼叫pipe()建立一條管道線,兩個子程序分別向管道各寫一句話:
Child process 1 is sending a message!
Child process 2 is sending a message!
而父程序則從管道中讀出來自於兩個子程序的資訊,顯示在螢幕上。
程式碼如下:
#include<unistd.h> #include<signal.h> #include<stdio.h> int pid1,pid2; main(){ int fd[2]; char OutPipe[100],InPipe[100]; pipe(fd);//建立管道 while((pid1=fork())==-1);//建立子程序pid 1 成功 if(pid1==0){ //子程序pid1 lockf(fd[1],1,0);//上鎖,只允許pid1 向管道中寫入 sprintf(OutPipe,"\n Child process1 is sending message! \n"); write(fd[1],OutPipe,50);//從管道的寫入端講50個數據寫入管道 sleep(5);//延時5秒 lockf(fd[1],0,0);//解鎖 exit(0);//子程序結束 } else{ while((pid2=fork())==-1);//建立子程序pid 2成功 if(pid2==0){//子程序pid2 ,基本同上 lockf(fd[1],1,0); sprintf(OutPipe,"\n Child process2 is sending message! \n"); write(fd[1],OutPipe,50); sleep(5); lockf(fd[1],0,0); exit(0);//子程序結束 } else{//父程序 wait(0);//等待子程序執行完畢 read(fd[0],InPipe,50);//從管道的讀出端讀出50個數據 printf("%s\n",InPipe); wait(0);//等待子程序執行完畢 read(fd[0],InPipe,50); printf("%s\n",InPipe); exit(0); } } }