我试图向特定进程发送SIGTSTP信号,但如何使用Linux中的C库函数或系统调用确定进程是否已实际挂起?
我试图向特定进程发送SIGTSTP信号,但如何使用Linux中的C库函数或系统调用确定进程是否已实际挂起?
从/proc/[pid]/stat
文件中读取。
根据man手册,可以从这个文件获得进程的状态:
state %c
字符串“RSDZTW”中的一个字符,其中R表示运行,S表示在可中断的等待中睡眠,D表示在不可中断的磁盘睡眠中等待,Z表示僵尸进程,T表示被跟踪或停止(接收到信号),W表示页面换入。
ps
。 - vy32我知道这是一篇旧帖子,但对于像我一样好奇的人来说!
简单的答案是只有一种静态、一致的方法可以检查状态,即从/proc/[pid]/stat
中进行检查,但如果您想尽可能少地依赖架构并且不想这样做,您可以检查信号。
信号只能被看到一次,所以你必须自己跟踪它,但waitpid
可以监听一个进程,以查看自上次检查以来是否收到任何信号:
BOOL is_suspended;
int status;
pid_t result = waitpid(pid, &status, WNOHANG | WUNTRACED | WCONTINUED);
if(result > 0) { // Signal has been received
if (WIFSTOPPED(status)) {
is_suspended = true;
} else if (WIFCONTINUED(status)) {
is_suspended = false;
}
}