如何在Linux中重定向生成的子进程的输出?

时间:2014-04-14 22:30:29

标签: linux exec

     pid_t pid;
     pid=fork();
     if (pid == 0)
     {
         //child process.
         execl("/opt/bin/version.out", "version.out > /tmp/version",0);
         _exit(0);
     }
     else
     {
         // this is parent, wait for child to finish.
         waitpid(pid, NULL, 0);
         verDir("/tmp/version");
     }

使用上面的c ++代码,我试图创建一个子进程,执行命令/opt/bin/version.out并将输出重定向到/ tmp / version,但它根本不创建/ tmp / version ,上述语法的任何错误? execl()和waitpid()语法是否正确?感谢。

4 个答案:

答案 0 :(得分:1)

重定向是一个shell函数,而不是内核函数。您可以通过shell运行命令:

execl("/bin/sh", "sh", "-c", "/opt/bin/version.out > /tmp/version", (char *)NULL);

作为一种更简单的替代方法,您可以使用popen()运行/opt/bin/version.out并将其输出直接读入您的程序。在这种情况下,您不必使用/tmp/version

FILE *version = popen("/opt/bin/version.out", "r");
... read from version ...
pclose(version);

答案 1 :(得分:1)

'>'重定向在execl中无效,因为它是一个shell命令....

尝试查看Running a script from execl()以获取如何调用shell来执行的示例....

如果你想避免shell调用,你必须做一个' dup'调用以关闭chiled进程中的stderr / stdout并将其打开到文件中 - 您可以在此处查看示例; fork, pipe exec and dub2

或者在您的子进程中,您可以通过关闭标准输出并将其重新打开为文件来强制输出到特定文件,如下所示;

 if (pid == 0)
     {
         //child process.
         close(1);
         creat("/tmp/version",0644); // this will create a new stdout
         close(2);
         dup(1);   // this will make stderr to also go to the same file.....

         execl("/opt/bin/version.out", "version.out",0);
         perror("execl didn't work"); // print out the error if execl failed...
         _exit(0);
     }.....

答案 2 :(得分:0)

而不是在 execl 的参数中进行重定向(这是不正确的),它应该作为 dup2 调用的一部分来完成。

这是一个代码片段,介绍如何在没有任何错误检查的情况下重定向到文件而不是stdout。

 int fd = open ("/tmp/version", O_CREAT|O_WRONLY|O_TRUNC); 
 dup2(fd, STDOUT_FILENO); 
 close(fd); 

现在,您可以使用 execl

启动二进制文件
 execl("/opt/bin/version.out","version.out", (char*)0); 

请添加适当的错误检查以确定是否存在文件和访问权限。

答案 3 :(得分:-2)

您需要在shell中运行它:

execl("/bin/sh", "sh", "-c", "/opt/bin/version.out > /tmp/version", (char*)NULL);

您还应该检查execl的返回值是否有错误。