Ale*_*lex 3 linux popen zombie-process
我们可以通过shell命令行检测某些是否是一个僵尸进程
ps ef -o pid,stat | grep <pid> | grep Z
Run Code Online (Sandbox Code Playgroud)
要在我们使用的C/C++程序中获取该信息popen(),但我们希望避免使用popen().有没有办法在不产生额外流程的情况下获得相同的结果?
我们使用的是Linux 2.6.32-279.5.2.el6.x86_64.
您需要使用proc(5)文件系统.访问其中的文件(例如/proc/1234/stat......)非常快(它不涉及任何物理I/O).
你可能想要第三个字段/proc/1234/stat(每个人都可以读取,但你应该按顺序读取它,因为它是不可见的.).如果该字段是Zpid 1234的过程是僵尸.
无需在C中分叉进程(例如使用popen或system),您可能需要编写代码
pid_t somepid;
// put the process pid you are interested in into somepid
bool iszombie = false;
// open the /proc/*/stat file
char pbuf[32];
snprintf(pbuf, sizeof(pbuf), "/proc/%d/stat", (int) somepid);
FILE* fpstat = fopen(pbuf, "r");
if (!fpstat) { perror(pbuf); exit(EXIT_FAILURE); };
{
int rpid =0; char rcmd[32]; char rstatc = 0;
fscanf(fpstat, "%d %30s %c", &rpid, rcmd, &rstatc);
iszombie = rstatc == 'Z';
}
fclose(fpstat);
Run Code Online (Sandbox Code Playgroud)
也考虑一下procps,libproc看看这个答案.
(您也可以阅读第二行,/proc/1234/status但这可能更难用C或C++代码解析)
顺便说一句,我发现stat文件中/proc/有一个奇怪的格式:如果你的可执行文件恰好在其名称中包含空格和括号(这很恶心,但允许)解析/proc/*/stat文件变得棘手.