1. 程式人生 > >程序間的通訊(一)

程序間的通訊(一)

編寫程式實現下列功能:

程序A向程序B傳送SIGUSR1訊號;
程序B收到訊號後,列印字串“receive SIGUSR1”;
要求用kill函式和signal函式實現以上功能;

 

訊號是比較複雜的通訊方式,用於通知程序中某種事件的發生。除了程序間的通訊之外,程序還能傳送訊號給程序本身;每種訊號型別都有對應訊號處理程式。大多數的訊號的系統預設操作是結束程序,當然,程序同樣可以向系統請求採取某些代替的操作。

例如:忽略訊號、恢復訊號的預設操作和執行一個預先設定的訊號處理函式。

訊號的本質是在軟體層次上對程序的中斷機制的一種模擬。在原理上,一個程序收到某種訊號和處理器收到中斷請求是一樣的。

訊號是所有的程序間的通訊機制中唯一一個非同步通訊機制,可以看作是非同步通知。

訊號的生命週期如下:

接下來我們通過signal和kill兩種方式分別實現程序間的通訊。

signal.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
void fun(int sig)
{
	if(sig = SIGUSR1)
		printf("Received SIGUSR1!\n");
}

int main()
{
	printf("This is A process,mypid is: %d\n",getpid());
	signal(SIGUSR1,fun);
	pause();
	return 0;	
}

此執行程式的方式和以往有些許不同,執行結果如下:

因為程式中有pause()語句,那麼程式執行到此就會停下知道有訊號傳送給此程序。

然後新建一個終端,在終端輸入kill -SIGUSR 11344,那麼第二個程序就會發送SIGUSR1訊號給pid為11344的程序,也就是程序A。之後程式輸出字串,程序結束。

接下來利用kill函式完成實驗。

kill.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
void fun(int sig)
{
	if(sig == SIGUSR1)
	  printf("Reseived SIGUSR1!\n");
}
int main()
{
	int pid;
	
	if(signal(SIGUSR1,fun) < 0)
		perror("signal");
	
	pid = fork();
	
	if(pid < 0)
	  perror("fork");
	else if(pid == 0)
	{
		printf("This is B process!\n");

		sleep(2);
	}
	else
	{
		printf("This is A process!\n");
		if(kill(pid,SIGUSR1) < 0)
		  perror("kill");
		return 0;
	}
}

程式執行結果: