2017-07-18 205 views
-2

我想在同一时间在ubuntu上使用C++代码运行多个命令。 我用system()调用来运行多个命令,但system()调用的问题是它一次只调用一个命令,而rest命令正在等待。下面的 我写了我的示例代码,这可以帮助你获得我想要做的。主要的事情是我想一次运行所有这些命令不是一个一个。请帮帮我。如何在linux中同时运行多个shell命令

在此先感谢。

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

在任何书籍/ etc你正在UNIX上学习C++,找到'fork()'部分。 – slim

+0

(更具体地说,在'fork()'和'exec()'以及一般的进程管理。 – slim

+1

你可以使用'int main(){return 0;}'你不检查'system'的返回值所以你不在乎你的命令运行是否成功,也可能不运行它们。 –

回答

-1

你有几个选项(总是):

  • 使用线程(C++标准库的实现是好的)来派生多个线程,每个执行系统调用然后终止。线程列表上的join等待它们全部终止。
  • 使用* NIX fork命令产生一个新进程,然后在每个子进程内使用exec执行所需的命令(请参阅here中的“将正确字符串送到正确的子进程”示例)。父进程可以使用waitpid来确定所有孩子何时完成了跑步,以便继续进行该计划。
  • 将“&”附加到您的每个命令中,这会告诉shell在后台运行每个命令(具体来说,system将在后台启动进程,然后返回,而不等待结果)。没有试过这个,不知道它是否会起作用。你不能再等待电话终止,但(谢谢PSkocik)。

只是指出 - 如果你同时运行这3个特定的命令,你不可能读取输出,因为它们都将文本同时打印到终端。

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

+2

最后一项是false。system(“&");'将异步创建孙子并返回。你通常不能'等待'对大孩子来说。 – PSkocik

+4

我的意见是'fork'&'waitpid'是最适合的解决方案,而不是线程。 –

+0

@PSkocik哦,不知道 - 我会更新回答。 – hnefatl

2

您应该阅读Advanced Linux Programming(有点旧,但免费)。你可能想(在传统的方式,最喜欢的贝壳做的):

  • 或许赶上SIGCHLDfork之前设置的信号处理程序,看到signal(7) & signal-safety(7) ...)

  • 通话fork(2)创造一个新的过程。一定要检查所有three病例(失败返回pid_t,孩子与pid_t,父母积极pid_t)。如果要与该进程进行通信,请使用pipe(2)(读取约pipe(7) ...)之前fork

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

  • 调用(父,也许后已经得到了一个SIGCHLDwait(2)waitpid(2)或相关的功能。

这是非常平常的。 Advanced Linux Programming的几个章节正在更好地解释它。

有没有必要在你的情况下使用线程。

但是,请注意的lscat的作用可以与不同的系统调用(在syscalls(2) ...列出)来完成,特别是read(2) & stat(2)。你可能甚至不需要运行其他进程。另请参见opendir(3) & readdir(3)

也许(尤其是如果你有几个过程沟通直通几个pipe(7) -s),你可能想使用poll(2)(或称老select(2))一些event loop。一些库提供了一个事件循环(特别是所有GUI小部件库)。