【问题标题】:send signal from parent process to child in C在C中从父进程向子进程发送信号
【发布时间】:2016-03-26 11:26:12
【问题描述】:

我的子进程无法开始工作。我需要传递信号并执行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;
}

【问题讨论】:

    标签: c linux signals fork


    【解决方案1】:

    您需要以某种方式添加同步,或者在您的fork() 之前调用signal()

    使用您当前的代码,您无法确保子进程在收到信号之前调用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;
    }
    

    此代码的输出示例:

    Process1 end
    Process2, pid=1397
    SIGUSR1 received
    

    【讨论】:

    • 你不能从信号处理程序中 printf。
    • @alk 我不知道,目前 DuckDuckGoing 它。
    猜你喜欢
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 2019-06-02
    • 1970-01-01
    相关资源
    最近更新 更多