exec中的标准输出和管道使用

时间:2014-05-21 14:35:43

标签: c exec fork pipe

我在理解UNIX系统中管道的正确使用方面遇到了问题。 我有一个创建子进程的主进程。子进程必须运行与父亲不同的程序,他必须进行一些操作,然后孩子必须与父亲沟通结果。 但是在子进程中我必须在终端上打印这些操作的部分结果。 我尝试使用测试程序,但我现在有点卡住了。这是主要的测试程序

TEST.C

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(){

  int mypipe[2];
  pid_t pid;
  char readbuffer[6];

  pipe(mypipe);

  if((pid = fork()) == 0){
    close(mypipe[0]);
    dup2(mypipe[1], STDOUT_FILENO);
    execlp("./proc", "./proc", NULL);
  } else {

  wait(-1);
  close(mypipe[1]);
  read(mypipe[0], readbuffer, sizeof(readbuffer));
  printf("%s", readbuffer); 
  }
}

./proc程序的c文件是这样的: PROC.C

#include <stdio.h>

int main(int argc, char* argv[]){

  printf("check\n");

  return 0;
}

使用此解决方案,proc程序无法在终端上打印任何内容。如何使proc程序在终端和管道上打印,以便主程序可以从那里读取? 谢谢!

2 个答案:

答案 0 :(得分:1)

即使将stdout重定向到父程序,您仍然可以使用stderr。当您想要打印到控制台时,只需拨打fprintf(stderr, ...)而不是printf(...)

答案 1 :(得分:1)

如果你想让你的“proc”程序在终端中打印日志/调试信息,你可以使用fprintf和stderr:

fprintf(stderr, "What you need to print\n");

您还可以查看程序的编写位置,使用strace