C 如何发送sigterm信号

C 如何发送sigterm信号,c,signals,C,Signals,在我下面的程序中,我有两个过程,父亲和孩子都做同样的事情,但我们想知道如何首先完成他的任务。有一个随机的秒数,两人都将睡眠,导致谁先完成的挑战更随机。两个进程都向另一进程发送信号,当接收到五个信号时,该进程将向另一进程发送一个SIGTERM,表示它已首先完成。其他进程将打印对手进程已获胜。我的问题是向另一个进程发送sigterm信号,我尝试了kill函数、singal函数,但不知道我的错误在哪里,下一步该尝试什么。因此,感谢您的帮助,以下是我的代码: //--------including--

在我下面的程序中,我有两个过程,父亲和孩子都做同样的事情,但我们想知道如何首先完成他的任务。有一个随机的秒数,两人都将睡眠,导致谁先完成的挑战更随机。两个进程都向另一进程发送信号,当接收到五个信号时,该进程将向另一进程发送一个SIGTERM,表示它已首先完成。其他进程将打印对手进程已获胜。我的问题是向另一个进程发送sigterm信号,我尝试了kill函数、singal函数,但不知道我的错误在哪里,下一步该尝试什么。因此,感谢您的帮助,以下是我的代码:

 //--------including--------------
 #include <stdio.h>
 #include <stdlib.h>
 #include <time.h>
 #include <sys/types.h>
 #include <signal.h>
 #include <unistd.h>
//-------global----------------
int sig1_counter=0;
int sig2_counter=0;
//-------prototypes--------------
void catch_sigusr1(int sig_num) ;
void catch_sigusr2(int sig_num) ;
void do_son() ;
void do_dad() ;
//--------main------------------
int main (){
pid_t pid;
srand((unsigned)time(NULL));

signal(SIGUSR1, catch_sigusr1) ;
signal(SIGUSR2, catch_sigusr2) ;

pid = fork() ;

switch(pid) {
case -1 : perror("fork() failed") ;
          exit(EXIT_FAILURE) ;
case 0 : do_son() ;
          exit(EXIT_SUCCESS) ;
default: do_dad() ;
          exit(EXIT_SUCCESS) ;
 }


    return EXIT_SUCCESS;
 }
//-------functions-------------------
void do_son() {
   int i ;
 for (i=0;i<10;i++)
 {
    int sleep_time=rand()%4;
    sleep(sleep_time);
    int num=rand()%2;
    if (num==0)
        kill(getpid(), SIGUSR1) ;
    else
        kill(getpid(), SIGUSR2);
 }
 }
//---------------------------------
void do_dad() {
   int i ;

  for (i=0;i<10;i++)
  {
    int sleep_time=rand()%4;
    sleep(sleep_time);
    int num=rand()%2;
    if (num==0)
        kill(getpid(), SIGUSR1) ;
    else
        kill(getpid(), SIGUSR2);
   }
  }
//---------------------------------
 void catch_sigusr1(int sig_num) {
     signal(SIGUSR1, catch_sigusr1);
     printf(" process %d got signal SIGUSR1\n", getpid()) ;
   if (sig_num==SIGTERM)
  {
    printf("process %d win\n", getpid());
    exit(EXIT_SUCCESS);
  }
   sig1_counter++;
  if (sig1_counter==5)
  {
    printf(" process %d surrender\n", getpid()) ;
    kill(getpid(),SIGTERM);        // here we have a mistake
    //signal(SIGTERM,catch_sigusr2);  // !!!!!!!!!!!
    exit(EXIT_SUCCESS);
   }
 }
//---------------------------------
 void catch_sigusr2(int sig_num) {
   signal(SIGUSR2, catch_sigusr2) ;
   printf(" process %d got signal SIGUSR2\n", getpid()) ;
  if (sig_num==SIGTERM)
  {
    printf("process %d win\n", getpid());
    exit(EXIT_SUCCESS);
  }
   sig2_counter++;
  if (sig2_counter==5)
  {
    printf(" process %d surrender\n", getpid()) ;
    kill(getpid(),SIGTERM);
    //signal (SIGTERM,catch_sigusr1);
    exit(EXIT_SUCCESS);
  }
} 
do_son和do_dad函数都向getpid发送信号,这意味着它们只发送自己的信号,而不是彼此的信号

为了相互发出信号,您需要:

发送信号给pid,fork返回值为子pid;和 不要将信号发送到父PID getppid,注意系统调用中使用的非性别歧视术语:- 换言之,在您的主要功能中有如下内容:

switch (pid = fork()) {
    case -1:
        perror("fork() failed");
        break;
    case 0:
        do_both(getppid());
        break;
    default:
        do_both(pid);
        break;
 }
没有明显的父函数和子函数的原因是唯一的区别是哪个PID得到信号。因为您将其作为参数传入,所以可以将两个函数组合起来:

void do_both(pid_t other) {
    for (int i = 0; i < 10; i++) {
        int sleep_time = rand() % 4;
        sleep(sleep_time);
        if ((rand() % 2) == 0)
            kill(getpid(), SIGUSR1);
        else
            kill(getpid(), SIGUSR2);
     }
 }

使用killgetpid,…,您可以向自己发送信号。根据您的描述,您希望将其发送到另一个进程,因此需要该进程的pid。另外,不要使用信号,它的定义不正确。改为使用。这些过程通常以无性别的方式被称为父级和子级。@williampersell-Hmmm。。。直到今天我才相信它是一切的母亲。我怎么会失败。。。