2016-10-06 21 views
0

我正在编写一个插入另一个程序的任务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 ");)我是这个领域的新手。你可以告诉我吗 ?

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

+0

什么是problem_你正在试图解决这样的_actual? –

回答

0

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

我假设你的管道配置良好,从父母到孩子。

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

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

第二个选项:(如果你管不好了)

使用共享内存。

创建共享内存对象。

将父母的STDOUT重定向到共享内存。

孩子可以看到它。

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

+0

那么,链接不是我的代码,只是一个类似的例子。我认为'system(“./ calc/calc”);'是我需要根据我的问题改变的地方。 Becaue我需要父进程来实现系统'printf'而孩子听标准输出 – shen

+0

尝试共享内存对象。更新了答案 – Naidu

相关问题