【问题标题】:Multiple line output from execlpexeclp 的多行输出
【发布时间】:2018-02-10 16:56:27
【问题描述】:

我正在尝试使用 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;
}

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

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;
}

【问题讨论】:

  • 我正在使用dup2() 将从execlp() 收到的信息发送到创建的套接字。你认为这会产生一些问题吗?抱歉不清楚,但我认为这不是问题。

标签: c++ exec


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢,但是以上面定义的第二种方法运行程序也会不正确吗?
  • 这取决于您所说的 “我只从 userdb 表中获取名字” 的意思。当您使用 execlp 并接管您的调用进程时,该进程无法“获取”任何内容,因为它不再执行。另一方面,运行 /bin/sh 的新进程可以将内容输出到终端,可能是您当前所需的全部内容。
  • 服务器中的 userdb 表设置有大约 10 个条目,但当 execlp()fork()dup2() 之间创建的套接字一起使用时,只有第一个条目被发送到客户端服务器和客户端。其他条目在服务器端打印为/bin/sh: 2: user2: not found。我正在尝试在客户端打印/发送整个 userdb 列表
  • 不用担心 - 我并不难过 - 只是解释说,除非你很好地提出问题,否则这个过程不会非常有效地工作。我确实希望您能深入了解它并很乐意提供帮助 - 只是很难按原样解决问题。
  • 您可以尝试将输入写入文件,然后使用cat 而不是echo,或者仔细引用和转义。您发布的代码似乎插入了换行符,这表明它仍然是一个问题。 (如果我没有快速回复进一步的 cmets,请提前道歉 - 宿醉很严重,现在是凌晨 5 点)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
相关资源
最近更新 更多