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函数的第二个参数中,一起发送给接受信号的进程
    */

猜你喜欢

转载自blog.csdn.net/qq_40663274/article/details/83926532