【问题标题】:How to fork a child process and redirect all of the program's output to the child process?如何分叉子进程并将程序的所有输出重定向到子进程?
【发布时间】:2016-10-06 16:51:47
【问题描述】:

我正在编写一项任务,该任务插入另一个程序的printf()。它分叉一个子进程并将所有程序的输出重定向到子进程。下面的代码是我写的还没有运行,我想我需要在上面添加这个函数。

int printf(char* format, ... )
{
    int res;
    static void *(*mallocp)(size_t size);
    char *error;
    if (!mallocp) {
    mallocp = dlsym(RTLD_NEXT, "printf");
        if ((error = dlerror()) != NULL) {
            fputs(error, stderr);
            exit(1);
        }
    }
    va_list args;
    va_start(args, format);
    res=mallocp(format, args);
    va_end(args);
    return res;
}

我找到了一个类似的解决方案,但略有不同。 Redirect stdin and stdout in child in c 在我分叉一个子进程并配置好管道后,我真的不知道,我怎样才能让父进程继续使用系统“printf”mallocp 来提供应该重定向到子进程的标准输出。 (在该示例中可能类似于system("./calc/calc ");)我是这个领域的新手。你可以告诉我吗 ?

顺便说一句,我不知道我是否错过了了解整个过程的实现,因为这是一个问题,我不知道官方的解决方案。

【问题讨论】:

  • 您试图以这种方式解决的实际问题是什么?

标签: c fork glibc


【解决方案1】:

使用“dup2”并将“stdout”替换为“pipe”写入文件描述符。

我假设您的管道从父级到子级配置良好。

然后孩子可以从另一端阅读。

dup2(fd, 1); //1 用于标准输出

第二种选择:(以防你的管道不再好)

使用共享内存。

创建共享内存对象。

将 STDOUT 从父级重定向到共享内存。

孩子可以看到。

这是一个例子 http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/shm/example-1.html

【讨论】:

  • 嗯,链接不是我的代码,只是一个类似的例子。我认为system("./calc/calc "); 是我需要根据我的问题进行更改的地方。因为我需要父进程来实现系统printf 而孩子听stdout
  • 尝试共享内存对象。更新答案
猜你喜欢
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
  • 2017-06-25
  • 1970-01-01
  • 2016-02-29
  • 2021-03-25
  • 2011-11-07
相关资源
最近更新 更多