如何分叉子进程并将所有程序的输出重定向到子进程?

时间:2016-10-06 16:51:48

标签: c fork glibc

我正在编写一个插入另一个程序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给出应该是的stdout重定向到子进程。 (在这个例子中可能有点像system("./calc/calc ");)我是这个领域的新手。你可以告诉我吗 ?

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

1 个答案:

答案 0 :(得分:0)

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

我认为您的管道配置良好,从父母到孩子。

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

dup2(fd,1); // 1适用于stdout

第二个选项:(如果您的管道不再好)

使用共享内存。

创建共享内存对象。

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

孩子可以看到它。

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