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

How to run multiple shell command at the same time in linux

本文关键字:运行 shell 命令 Linux      更新时间:2023-10-16

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

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

  • 也许捕获SIGCHLD(在fork之前设置信号处理程序,请参阅Signal(7(和Signal-Safety(7(...(

  • 调用 fork(2( 创建一个新进程。请务必检查所有三种情况(返回pid_t为负的失败、pid_t为 0 的子项、pid_t为正的父级(。如果要与该进程通信,请使用 pipe(2( (阅读有关 pipe(7(...(fork之前.

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

  • 调用(在父级中,也许在获得SIGCHLD之后(wait(2(或waitpid(2(或相关函数。

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

在您的情况下,无需使用线程。

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

也许(特别是如果你通过多个pipe(7(-s与多个进程进行通信(,你可能希望使用poll(2((或较旧的select(2)(进行一些事件循环。一些库提供事件循环(特别是所有 GUI 小部件库(。

您有几个选择(一如既往(:

  • 使用线程(C++标准库实现很好(生成多个线程,每个线程执行系统调用然后终止。join线程列表上等待它们全部终止。
  • 使用
  • *NIXfork命令生成一个新进程,然后在每个子进程中使用exec执行所需的命令(有关"将正确的字符串传递给正确的子进程"的示例,请参阅此处(。父进程可以使用waitpid来确定所有子进程何时完成运行,以便继续执行程序。
  • 将"&"附加到每个命令,这将告诉 shell 在后台运行每个命令(具体来说,system将在后台启动进程然后返回,而无需等待结果(。没有尝试过这个,不知道它是否有效。然后你不能等待呼叫终止(感谢 PSkocik(。

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

如果您确实需要从程序内部读取输出(尽管您的问题中未提及(,这是相关的(尽管它不使用system(。