程序間的通訊(一)
阿新 • • 發佈:2018-12-24
編寫程式實現下列功能:
程序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; } }
程式執行結果: