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