C++ fork 进程但不是子进程
Posted
技术标签:
【中文标题】C++ fork 进程但不是子进程【英文标题】:C++ fork process but not as child 【发布时间】:2020-04-23 15:01:36 【问题描述】:我有一个命令,它提供有关正在运行的进程的诊断信息。我想在进程崩溃之前触发/执行此命令并将输出捕获到标准输出/文件。
但是,此命令不能作为其监视的进程的子进程运行。该命令正在检测这一点。它需要作为一个单独的父进程进行分叉。
有没有办法产生一个新的进程,执行命令但不是作为一个孩子?
【问题讨论】:
打开一个文件并使用dup2
将子进程的stdout
文件替换为新文件?你有没有尝试过这样的事情?
@StephenNewell 必须承认我以前从未做过这样的事情。目前我刚刚使用 pipe() 和 popen() 来执行命令,当我发现我无法在同一个进程中运行它时。
【参考方案1】:
这是使用我在评论中询问的方法的一个非常基本的示例:
#include <sys/types.h>
#include <sys/stat.h>
#include <assert.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int main()
int result = fork();
if(result == 0)
int fd = open("test", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
assert(fd >= 0);
int result = dup2(fd, STDOUT_FILENO);
assert(result != -1);
char * const argv[] = "ls", NULL;
char * const env[] = NULL ;
result = execve("/bin/ls", argv, env);
assert(result != -1);
return 0;
您必须根据需要对其进行调整,但这会将ls
的结果存储在文件“test”中。诀窍是dup2
将标准输出文件描述符STDOUT_FILENO
替换为我们新打开的文件的文件描述符副本,因此ls
的输出被重定向。
我认为您将能够使用它来获取命令的输出。
【讨论】:
嗨,不确定您是否看到我对问题的编辑?当我尝试分叉自己时,诊断检测到它是父母的孩子并且它仍然拒绝运行。我假设父母不能派生父母,所以我可能需要让父母处理诊断,派生孩子(我的应用程序),当我的应用程序发出信号时,父母可以运行诊断命令? 我没有看到您的编辑。诊断工具是否采用路径/参数来监控进程? 是的,只有一个参数,但命令是结构化的:“命令某事”,其中某事是一个参数。但是,没有开关/标志破折号。参数由命令后的空格定义。 那么为什么不做类似monitor-tool your-command your-command-args
的事情呢?这类似于valgrind
和其他动态分析工具的工作方式。以上是关于C++ fork 进程但不是子进程的主要内容,如果未能解决你的问题,请参考以下文章