将信号从父进程发送到 C 中的子进程

Bob*_*Bob 1 c linux fork signals

我的孩子进程无法开始工作。我需要传递信号并执行readUsual函数。

这是一小段代码:

int main()
{
    pid_t pid2 = fork(); 
    if (pid2 < 0) 
        printf("Can't create child process\n");
    else if (pid2==0)
    {
        //this block never execute
        printf("Process2, pid=%d\n",getpid());
        signal(SIGUSR1,readUsual); 
    }
    else 
    {
        kill(pid2,SIGUSR1);
        printf("%s\n","Proccess1 end");
        for(;;);
    }

return 0;
}
Run Code Online (Sandbox Code Playgroud)

jda*_*nay 6

您需要以某种方式添加同步,或者signal()fork().

使用您当前的代码,您无法确保子进程signal()在收到信号之前调用。在处理它的指令之前收到信号将停止子进程。

例子:

#include <stdio.h>

#include <sys/types.h>
#include <signal.h>
#include <unistd.h>

static int received = 0;

void readUsual(int sig)
{
    if (sig == SIGUSR1)
    {
        received = 1;
    }
}

int main()
{
    signal(SIGUSR1,readUsual);

    pid_t pid2 = fork(); 
    if (pid2 < 0)
        printf("Can't create child process\n");
    else if (pid2==0)
    {
        printf("Process2, pid=%d\n",getpid());
        while (!received)
            ;
        printf("SIGUSR1 received.\n");
    }
    else 
    {
        kill(pid2,SIGUSR1);
        printf("%s\n","Proccess1 end");
        while (1)
            ;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用此代码的输出示例:

Process1 end
Process2, pid=1397
SIGUSR1 received
Run Code Online (Sandbox Code Playgroud)

  • 你不应该从信号处理程序中 printf 。 (2认同)