execlp的多行输出

时间:2018-02-10 16:56:27

标签: c++ exec

我试图使用execlp返回多行输出,但我不确定这样做的确切方法。我试过了

#include <iostream>
#include <string>
#include <unistd.h>
using namespace std;

int main()
{
   string str = "echo ";
   str += "one \n";
   str += "two \n";
   str += "three \n";
   if(execl("/bin/sh","/bin/sh","-c",str.c_str(),(char*)NULL) == -1)
   {
      printf("Child Execution Failed\n");
      exit(1); 
   }                
   exit(0);
   return 0;
}

我基本上希望在shell中打印所有onetwothree。我得到以下输出

one
/bin/sh: 2: two: not found
/bin/sh: 3: three: not found

再次感谢!

答案:找到一个简单的答案:

#include <iostream>
#include <string>
#include <unistd.h>
using namespace std;

int main()
{
   string str = "echo one\n";
   str += "echo two\n";
   str += "echo three\n";

   if(execl("/bin/sh","/bin/sh","-c",str.c_str(),(char*)NULL) == -1)
   {
      printf("Child Execution Failed\n");
      exit(1); 
   }                
   exit(0);
   return 0;
}

1 个答案:

答案 0 :(得分:2)

execlp替换使用execlp参数中指定的程序调用它的当前进程。请参阅man page并注意:

  

exec()系列函数用新的过程映像替换当前过程映像。

尝试多次调用execlp的循环是没有意义的,因为在第一次调用execlp之后,您的程序不再执行。有一些方法可以使用execlpfork或fork的变体之一结合使用,但有更简单的选择......

相反,使用popen运行一个不同的子进程并有一个管道来读取它的输出。