【问题标题】:C++ fork process but not as childC++ fork 进程但不是子进程
【发布时间】:2020-04-23 15:01:36
【问题描述】:

我有一个命令,它提供有关正在运行的进程的诊断信息。我想在进程崩溃之前触发/执行此命令并将输出捕获到标准输出/文件。

但是,此命令不能作为其监视的进程的子进程运行。该命令正在检测这一点。它需要作为一个单独的父进程进行分叉。

有没有办法产生一个新的进程,执行命令但不是作为一个孩子?

【问题讨论】:

  • 打开一个文件并使用dup2将子进程的stdout文件替换为新文件?你有没有尝试过这样的事情?
  • @StephenNewell 必须承认我以前从未做过这样的事情。目前我刚刚使用 pipe() 和 popen() 来执行命令,当我发现我无法在同一个进程中运行它时。

标签: c++ linux fork


【解决方案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 和其他动态分析工具的工作方式。
猜你喜欢
  • 2018-05-16
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-09
  • 2022-11-13
  • 1970-01-01
  • 2018-12-29
相关资源
最近更新 更多