在C中获取信号发送器的PID

时间:2018-02-16 15:44:17

标签: c

我一直在寻找一种方法来返回信号发送者进程的pid。这是我的代码

void get_pid(int sig, siginfo_t *info, void *context)
{
        printf("PID of signal sender = %d\n", info->si_pid);
}

int main(int argc, char **argv)
{
        struct sigaction        sa;

        printf("PID: %d\n", getpid());       //display PID for kill()
        sa.sa_flags = SA_SIGINFO;
        sa.sa_sigaction = get_pid;
        sigaction(SIGUSR1, &sa, NULL);
        pause();                            //wait for a signal
}

该程序首先显示其PID,因此另一个程序可以使用kill()向其发送信号。然后它调用pause(),这样程序在收到信号之前就不会结束。

如何从主功能中访问发送方的PID。

1 个答案:

答案 0 :(得分:5)

您的代码存在问题:

  1. 您的信息是getpid()而不是get_pid()getpid是现有的库函数。

  2. 不要在信号处理程序中调用printf。这不是信号安全的。

  3. 执行此操作的正确方法是在处理程序中设置变量并将其打印在main

    static volatile int signalPid = -1;
    void    get_pid(int sig, siginfo_t *info, void *context)
    {
        signalPid = info->si_pid;
    }
    
    int main(int argc, char **argv)
    {
        struct sigaction        sa;
    
        printf("PID: %d\n", getpid());       //display PID for kill()
        sa.sa_flags = SA_SIGINFO;
        sa.sa_sigaction = get_pid;
        sigaction(SIGUSR1, &sa, NULL);
        pause();                           //wait for a signal
        printf("PID of signal sender = %d\n", signalPid);
    }
    

    一旦你调用了正确的信号处理程序,就可以了。