我必须在终端插入一个奇数。此后,它将生成两个过程A和B。
然后,它向B发送SIGUSR2
信号,并且其处理程序打印argv[1]
的倒数。然后,B睡眠argv[1]
秒,并在终止之前将SIGUSR1
信号发送给A进程。进程A的SIGUSR1
处理程序将打印一些内容,然后终止。
问题是进程A的SIGUSR1
处理程序不起作用,因为SIGUSR2
处理程序无法为进程B发送信号。实际上,kill(A,SIGUSR1)
告诉您没有这样的进程(对于进程A) 。在进程A中设置信号处理程序后,它位于pause()
中。
谁能帮我解决?谢谢。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
int arg;
int pid1 = 11, pid2 = 12;
void sigusr2Handler1(int);
void sigusr1Handler2(int);
int main(int argc, char* argv[])
{
if(argc != 2){
printf("Usage: %s num(int)\n", argv[0]);
exit(1);
}
arg = atoi(argv[1]);
pid1 = fork();
if (pid1 != 0)
pid2 = fork();
if (arg%2 != 0) {
if (pid1 == 0) {
if (signal(SIGUSR1, sigusr1Handler2) == SIG_ERR) {
printf("PID %d can't catch SIGUSR1\n", getpid());
exit(1);
}
printf("PID1 %d sigusr1 handler2 installation\n", getpid());
pause();
}
if (pid2 == 0) {
signal(SIGUSR2, sigusr2Handler1);
printf("PID2 %d sigusr2 handler installation\n", getpid());
kill(0, SIGUSR2);
}
}
return 0;
}
void sigusr2Handler1(int sig)
{
printf("PID %d Received SIGUSR2. 1/%d = %f.\n", getpid(), arg, (float)1 / arg);
sleep(arg);
if (kill(pid1, SIGUSR1) < 0) {
perror("Kill error");
exit(1);
}
printf("PID %d. Sent SIGUSR1 to %d. Closing\n", getpid(), pid1);
exit(0);
}
void sigusr1Handler2(int sig)
{
printf("PID %d Received SIGUSR1. Closing.\n", getpid());
exit(0);
}
最佳答案
pid1在pid2尝试向其发送SIGUSR1时已被杀死。 pid2是杀手.。
当pid2发出kill(0, SIGUSR2),
时,它将发送SIGUSR2 to the entire process group,包括pid1。这将杀死不准备接收SIGUSR2的pid1。
关于c - Kill()错误:没有这样的过程?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27175050/