如何找到所有子进程?

c47*_*57p 16 c linux process

在我正在开发的基于Linux的项目中,我需要能够找到所有子进程.每次开始记录都是不可行的 - 它们需要在事后发现.这需要是纯C,我想在没有读/ proc的情况下这样做.有谁知道如何做到这一点?

RC.*_*RC. 5

您可以使用popen

就像是。(希望语法足够接近)

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc,char * argv [])
{
    FILE * fp = popen(“ ps -C *您的程序名称在这里* --format'%P%p'”,“ r”);
    如果(fp == NULL)
    {
        printf(“ ERROR!\ n”);
    }

    char parentID [256];
    char processID [256];
    而(fscanf(fp,“%s%s”,parentID,processID)!= EOF)
    {
         printf(“ PID:%s父级:%s \ n”,processID,parentID);

         //检查parentID以查看是否与您的进程相同
    }

    pclose(fp);

    返回1;
}



Ale*_*own 5

通常,每次启动子进程时都记录下来是完全可行的。方便地,父进程被传递子进程的pid值作为创建它的fork调用的返回值。

如手册页所述:

pid_t fork(void);
Run Code Online (Sandbox Code Playgroud)

如果您能告诉我们您为什么认为这不可行,这将有所帮助。


Cha*_*ens 5

我发现你的评论是,记录进程的创建是不可行的,但如果你真的不能(可能是因为你不知道会创建多少并且不想保留realloc内存),然后我可能会打开所有与 glob 匹配的文件/proc/[1-9]*/status并查找说明我的进程 IDPPid: <num>在哪里的行<num>

  • 你可能无法记录每个子进程的创建的一个完全合理的原因:如果你知道一个库分叉进程,并且它没有给你他们的 PID。 (9认同)
  • 这个评论并不奇怪。如果您的进程是子收割者 (PR_SET_CHILD_SUBREAPER) 并且您的孙子进程被提升为子进程,则记录进程的创建是不可行的。您可以使用 ptrace 跟踪它的创建,但性能损失可能会很大。 (2认同)