【问题标题】:Kill() error: no such process?Kill() 错误:没有这样的过程?
【发布时间】:2014-11-27 16:23:31
【问题描述】:

我必须通过终端插入一个奇数。在此之后,它会生成两个进程,A 和 B。 然后它将SIGUSR2 信号发送给B,他的处理程序打印argv[1] 的倒数。然后,B 休眠argv[1] 秒,并在终止之前向 A 进程发送SIGUSR1 信号。进程 A 的 SIGUSR1 处理程序打印一些内容然后终止。 问题是进程A的SIGUSR1处理程序不起作用,因为进程B的SIGUSR2处理程序无法发送信号。事实上,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);
}

【问题讨论】:

    标签: c process signals posix kill


    【解决方案1】:

    pid1pid2 尝试向它发送 SIGUSR1 时已被杀死。 pid2 是杀手。

    pid2 发出 kill(0, SIGUSR2), 时,这会发送 SIGUSR2 to the entire process group,包括 pid1。这会杀死未准备好接收 SIGUSR2 的 pid1

    【讨论】:

    • 不幸的是,我认为它是正确的。我将其更正为 kill(getpid(),SIGUSR2,现在它工作正常。但是,如果我从父进程 kill(pid2,SIGUSR2) 开始,它就不再工作了。我怎样才能将来自父亲的信号发送到流程 B?
    猜你喜欢
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 2012-08-19
    • 1970-01-01
    • 2023-03-08
    • 2015-03-24
    相关资源
    最近更新 更多