1. 程式人生 > >Linux高階程式設計基礎——程序間通訊之訊號值操作

Linux高階程式設計基礎——程序間通訊之訊號值操作

程序間通訊之訊號值操作

  1. 程序A向程序B傳送訊號,該訊號的附帶資訊為一個值為20的整數;
  2. 程序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);  //列印隨著訊號一起傳遞過來的整數
 }

/*

  1. 這個整數值怎麼傳遞過來的?? 這個整數值會在訊號傳送時整合到在sigqueue函式的第二個引數中,一起傳送給接受訊號的程序 */