如果 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/sh
和 exec
的 Somebinary
,否则你会得到 /bin/sh
.
的 PID
我想获取某个进程的 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/sh
和 exec
的 Somebinary
,否则你会得到 /bin/sh
.