You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中通过siginfo_t获取发送信号进程的PID?

解决siginfo_t获取发送信号进程PID的错误问题

你的代码错误主要有两点:一是误用了联合成员的访问方式,二是针对非SIGCHLD信号错误访问了_sigchld成员。

错误原因解析

  1. 联合成员访问错误:_sifields是siginfo_t中的联合类型,_sigchld是联合内的结构体成员(不是指针),因此不能用->访问其内部字段,正确的访问方式是.。
  2. 成员场景不匹配:_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 12:18:28