我必须在终端插入一个奇数。此后,它将生成两个过程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/

10-12 05:07