1. 程式人生 > 其它 >作業系統實驗2

作業系統實驗2

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);
		}
	}
}

執行結果截圖: