我正在尝试使用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());
}
}
答案 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>
致电(在父母中,可能是在获得SIGCHLD
)wait(2)或waitpid(2)或相关功能之后。
这很平常。 Advanced Linux Programming的几个章节更好地解释了它。
您的案例中无需使用线程。
但是,请注意ls
和cat
的作用可以通过各种系统调用完成(在syscalls(2) ...中列出),特别是read(2)&amp; stat(2)。您甚至可能不需要运行其他进程。另见opendir(3)&amp; readdir(3)
也许(特别是如果您通过几个pipe(7) - 与几个流程进行通信),您可能希望使用event loop(或更早版本)poll(2) select(2)
)。一些库提供事件循环(特别是所有GUI小部件库)。
答案 1 :(得分:-1)
您有一些选择(一如既往):
join
等待它们全部终止。fork
命令生成一个新进程,然后在每个子进程中使用exec
执行所需的命令(有关&#34}的示例,请参阅here。把正确的字符串给正确的孩子&#34;)。父进程可以使用waitpid
来确定所有子进程何时运行完毕,以便继续使用该程序。system
将在后台启动进程然后返回,而不等待结果)。没试过这个,不知道它是否有效。然后你不能等待电话终止(感谢PSkocik)。指出 - 如果你同时运行这3个特定命令,你就不太可能读取输出,因为它们会同时向终端打印文本。< / p>
如果您确实需要阅读程序中的输出(虽然问题中未提及),this是相关的(尽管它不使用system
)。