Linux高階程式設計基礎——程序間通訊之訊號值操作
阿新 • • 發佈:2018-12-20
程序間通訊之訊號值操作
- 程序A向程序B傳送訊號,該訊號的附帶資訊為一個值為20的整數;
- 程序B完成接收訊號的功能,並且打印出訊號名稱以及隨著訊號一起傳送過來的整形變數值。
/這個實驗分成兩個小部分。要把這兩個小程式分開執行,在執行這兩個程式之前先在終端上進入root使用者,開啟兩個終端,分別執行這兩個程式/
//這個是訊號的傳送程式
#include <stdio.h> #include <signal.h> #include <sys/types.h> #include <errno.h> int main() { int pid; printf ("請輸入你將要傳送給訊號的程序的程序號:"); scanf ("%d",&pid); //輸入接收訊號的程序號 union sigval mysigval; mysigval.sival_int = 20; //把20 這個數放在引數中 if (sigqueue(pid,SIGUSR1,mysigval) == -1) //向該程序傳送訊號,並且攜帶一個整數,這個整數會放在第二個引數中,一起傳送給接受訊號的程序 perror("sigqueue error"); else printf ("send ok \n"); return 0; }
//這個是訊號的接受程式
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <sys/types.h> void myFun(int, siginfo_t*, void *p); int main(int argc, char* argv[]) { struct sigaction act; int sig; pid_t pid; pid = getpid(); printf("pid is:%d\n",pid); 打印出這個程序的 PID sigemptyset(&act.sa_mask); act.sa_sigaction = myFun; //定義接受訊號的處理函式 act.sa_flags = SA_SIGINFO; //設定該引數表示可以接收額外的引數; if(sigaction(SIGUSR1, &act, NULL)<0) //訊號接受函式 { printf("install sig error\n"); return 0; } pause (); return 0; } void myFun(int signo, siginfo_t *info, void *p) { if (signo == SIGUSR1) printf ("the signo is : SIGUSR1 \n"); printf("the int value is %d \n",info->si_value.sival_int); //列印隨著訊號一起傳遞過來的整數 }
/*
- 這個整數值怎麼傳遞過來的?? 這個整數值會在訊號傳送時整合到在sigqueue函式的第二個引數中,一起傳送給接受訊號的程序 */