如果 exec family in C/C++ in linux,如何在子进程内部启动某些进程的 pid?

How to get pid of some process started inside child process with help if exec family in C/C++ in linux?

我想获取某个进程的 pid(我们称之为 Somebinary),它是在子进程内的 exec 系列的帮助下启动的,并假设 Somebinary 一旦启动就永远不会停止。我想从父进程打印这个进程的pid。

我等不及在父进程中等待了,因为子进程将通过 exec* 启动 Somebinary,而且永远不会停止。我知道我能做到:

int start(std::string Somebinary){
    pid_t childpid = fork();
    if(childpid == 0){
        freopen(logfile.c_str(), "a+", stdout);
        dup2(1, 2);

        exec*("/bin/sh", "sh", "-c", Somebinary.c_str(), " &", NULL)
        exit(1);
    }
    // print pid of Somebinary from here
    return 0;
}

但我想尽可能减少额外开销。

基本上,我想像在 C/C++ 中的 bash 中那样做以下事情:

Bash

$ Somebinary > logfile 2>&1 &
$ pidof Somebinary

我知道我可以在子进程中借助 freopen 和 dup2 进行 stdout 和 stderr 重定向。但剩下的就是疑问了。

P.S.: 这必须在 Linux

中完成

非常感谢您的帮助。

请注意 exec 不会“创建进程”或更改 PID,fork 会。

正如@kaylum 所说,childpid 已经是已执行进程的 PID。你可以打印它:

int start(std::string Somebinary){
    pid_t childpid = fork();
    if(childpid == 0){
        freopen(logfile.c_str(), "a+", stdout);
        dup2(1, 2);

        exec(Somebinary.c_str(), NULL);
        exit(1);
    }
    if (childpid < 0) { // basic error handling
        perror("fork"); return -1;
    }
    // print pid of Somebinary from here
    printf("childpid = %jd\n", (intmax_t) childpid);
    return 0;
}

另外你可能想直接绕过 /bin/shexecSomebinary,否则你会得到 /bin/sh.

的 PID