如何在linux中同时运行多个shell命令
我想在同一时间在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());
}
}
你有几个选项(总是):
- 使用线程(C++标准库的实现是好的)来派生多个线程,每个执行系统调用然后终止。线程列表上的
join
等待它们全部终止。 - 使用* NIX
fork
命令产生一个新进程,然后在每个子进程内使用exec
执行所需的命令(请参阅here中的“将正确字符串送到正确的子进程”示例)。父进程可以使用waitpid
来确定所有孩子何时完成了跑步,以便继续进行该计划。 - 将“&”附加到您的每个命令中,这会告诉shell在后台运行每个命令(具体来说,
system
将在后台启动进程,然后返回,而不等待结果)。没有试过这个,不知道它是否会起作用。你不能再等待电话终止,但(谢谢PSkocik)。
只是指出 - 如果你同时运行这3个特定的命令,你不可能读取输出,因为它们都将文本同时打印到终端。
如果您确实需要读取程序内的输出(虽然未在您的问题中提及),但this是相关的(尽管它不使用system
)。
您应该阅读Advanced Linux Programming(有点旧,但免费)。你可能想(在传统的方式,最喜欢的贝壳做的):
或许赶上
SIGCHLD
(fork
之前设置的信号处理程序,看到signal(7) & signal-safety(7) ...)通话fork(2)创造一个新的过程。一定要检查所有three病例(失败返回
pid_t
,孩子与pid_t
,父母积极pid_t
)。如果要与该进程进行通信,请使用pipe(2)(读取约pipe(7) ...)之前的fork
。在子进程中,关闭一些无用的文件描述符,然后运行一些
exec
函数(或底层的execve(2))来运行所需的程序(例如,/bin/ls
)调用(父,也许后已经得到了一个
SIGCHLD
)wait(2)或waitpid(2)或相关的功能。
这是非常平常的。 Advanced Linux Programming的几个章节正在更好地解释它。
有没有必要在你的情况下使用线程。
但是,请注意的ls
和cat
的作用可以与不同的系统调用(在syscalls(2) ...列出)来完成,特别是read(2) & stat(2)。你可能甚至不需要运行其他进程。另请参见opendir(3) & readdir(3)
也许(尤其是如果你有几个过程沟通直通几个pipe(7) -s),你可能想使用poll(2)(或称老select(2)
)一些event loop。一些库提供了一个事件循环(特别是所有GUI小部件库)。
在任何书籍/ etc你正在UNIX上学习C++,找到'fork()'部分。 – slim
(更具体地说,在'fork()'和'exec()'以及一般的进程管理。 – slim
你可以使用'int main(){return 0;}'你不检查'system'的返回值所以你不在乎你的命令运行是否成功,也可能不运行它们。 –