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 进程但不是子进程的主要内容,如果未能解决你的问题,请参考以下文章

C++ fork 进程但不是子进程

linux进程原语之fork()(原创!)

创建一个不是创建进程子进程的新进程

Linux学习-进程管理

fork() 和 wait() 有两个子进程

Shell脚本入门 07:进程与信号