如何在linux中同时运行多个shell命令

时间:2017-07-18 08:00:23

标签: c++ linux shell

我正在尝试使用c ++代码同时在ubuntu中运行多个命令。 我使用system()调用来运行多个命令但是system()调用的问题是它一次只调用一个命令而其余命令正在等待。 下面我写了我的示例代码,这可以帮助你得到我想要做的事情。 主要的是我想一次又一次地运行所有这些命令。请帮帮我。

提前致谢。

main()
{   
   string command[3];
   command[0]= "ls -l";
   command[1]="ls";
   command[2]="cat main.cpp";  

   for(int i=0;i<3;i++){
       system(command[i].c_str());
   }   
}

2 个答案:

答案 0 :(得分:2)

你应该阅读Advanced Linux Programming(有点旧,但免费提供)。您可能想要(以传统方式,像大多数shell一样):

  • 或许抓住SIGCHLD(在 fork之前设置信号处理程序,请参阅signal(7)&amp; signal-safety(7) ...)< / p>

  • 致电fork(2)以创建新流程。请务必检查所有three个案例(否定为已退回的pid_t,带有0 pid_t的孩子,带有pid_t的家长。如果您想与该流程进行沟通,请先使用pipe(2)(阅读pipe(7) ...),然后 fork

  • 在子进程中
  • ,关闭一些无用的文件描述符,然后运行一些exec函数(或底层的execve(2))来运行所需的程序(例如/bin/ls)< / p>

  • 致电(在父母中,可能是在获得SIGCHLDwait(2)waitpid(2)或相关功能之后。

这很平常。 Advanced Linux Programming的几个章节更好地解释了它。

您的案例中无需使用线程。

但是,请注意lscat的作用可以通过各种系统调用完成(在syscalls(2) ...中列出),特别是read(2)&amp; stat(2)。您甚至可能不需要运行其他进程。另见opendir(3)&amp; readdir(3)

也许(特别是如果您通过几个pipe(7) - 与几个流程进行通信),您可能希望使用event loop(或更早版本)poll(2) select(2))。一些库提供事件循环(特别是所有GUI小部件库)。

答案 1 :(得分:-1)

您有一些选择(一如既往):

  • 使用线程(C ++标准库实现很好)来生成多个线程,每个线程执行一次系统调用然后终止。线程列表上的join等待它们全部终止。
  • 使用* NIX fork命令生成一个新进程,然后在每个子进程中使用exec执行所需的命令(有关&#34}的示例,请参阅here。把正确的字符串给正确的孩子&#34;)。父进程可以使用waitpid来确定所有子进程何时运行完毕,以便继续使用该程序。
  • 追加&#34;&amp;&#34;对于每个命令,它们告诉shell在后台运行每个命令(具体来说,system将在后台启动进程然后返回,而不等待结果)。没试过这个,不知道它是否有效。然后你不能等待电话终止(感谢PSkocik)。

指出 - 如果你同时运行这3个特定命令,你就不太可能读取输出,因为它们会同时向终端打印文本。< / p>

如果您确实需要阅读程序中的输出(虽然问题中未提及),this是相关的(尽管它不使用system)。