如何在C语言中通过siginfo_t获取发送信号进程的PID?
解决siginfo_t获取发送信号进程PID的错误问题
你的代码错误主要有两点:一是误用了联合成员的访问方式,二是针对非SIGCHLD信号错误访问了_sigchld成员。
错误原因解析
- 联合成员访问错误:
_sifields是siginfo_t中的联合类型,_sigchld是联合内的结构体成员(不是指针),因此不能用->访问其内部字段,正确的访问方式是.。 - 成员场景不匹配:
_sigchld是专门为SIGCHLD信号设计的成员,存储的是终止子进程的PID;而你处理的是SIGINT(信号2),发送信号的进程PID直接存储在siginfo_t的通用字段si_pid中,无需通过_sifields。
修正后的代码
信号处理函数修改为:
void UserTerminationNotified(int sig, siginfo_t* info, void* vp){ printf("发送信号的进程PID: %d\n", info->si_pid); exit(0); }
补充说明
- 若你需要处理SIGCHLD信号(捕获子进程终止),此时访问子进程PID的正确写法是:
printf("终止的子进程PID: %d\n", info->_sifields._sigchld.si_pid); - 编译时需确保包含必要头文件:
<signal.h>、<stdio.h>、<stdlib.h>、<string.h>。
内容的提问来源于stack exchange,提问作者Matteo Pagliarello
相关产品推荐
相关产品推荐

