C++;-Linux/shell脚本运行子进程&;获取他们的返回状态 我正在寻找一个解决方案,在Linux上编写一个C++程序,该程序解析包含一个包含一个参数的程序的文件,然后用参数参数运行这些程序。p>

C++;-Linux/shell脚本运行子进程&;获取他们的返回状态 我正在寻找一个解决方案,在Linux上编写一个C++程序,该程序解析包含一个包含一个参数的程序的文件,然后用参数参数运行这些程序。p>,c++,linux,bash,process,execute,C++,Linux,Bash,Process,Execute,每个程序(行)一次执行一个,然后父进程等待每个子进程退出并检查其退出状态(我只对0感兴趣) 要分析的文本示例: prog1-a arg1-m arg2-c arg3 程序2 arg1 arg2 arg3 arg4 我认为最好将所有内容存储在字符串向量中,例如: vector <std::string> p_vector; while (getline(file, line)) p_vector.push_back(line); 或者,我应该更好地使用它吗 string c

每个程序(行)一次执行一个,然后父进程等待每个子进程退出并检查其退出状态(我只对0感兴趣)

要分析的文本示例:

prog1-a arg1-m arg2-c arg3 程序2 arg1 arg2 arg3 arg4

我认为最好将所有内容存储在字符串向量中,例如:

vector <std::string> p_vector;
while (getline(file, line))
    p_vector.push_back(line);
或者,我应该更好地使用它吗

string command = p_vector[i]; // eg: ls -l -a -l folder_one , put more arguments because I do not know the exact number of them for each parsed line

int exitCode = system(command.c_str());

如果任何人都有使用脚本的想法,那也是受欢迎的,尽管我的问题的范围是C++!p> 我本可以使用Qt的QProcess,因为我知道如何使用它,但这可能会引起一些法律问题,我现在已经知道了(共享代码没有问题,但是,我工作的公司可能不允许这样做)

谢谢,期待您的回答

在bash中:

echo file | while read command
do
   eval $command
done

其中,
file
是每行包含一个程序及其参数的文件

我同意Ignacio。但如果您必须这样做,那么我希望您使用System/popen命令

但请确保您没有运行任何会给您带来麻烦的命令。。比如“rm-rf*”

如果您要从无法信任的文件中读取,则很可能发生这种情况

并且无需将其复制到新字符串,您可以执行“system(p_vector[i].c_str());”

要使用
exec
系列,您必须将
p\u向量[i]
解析为令牌。第0令牌标识要执行的程序;其余的参数指定程序的参数
execvp
模拟shell的功能:它在搜索路径中搜索程序
execv
希望您更进一步。您需要指定程序的路径,但不一定是完整路径;相对路径工作得很好。关于
exec
,还有一个小问题:第0个参数应该是程序名的副本。在这种情况下需要做很多工作

基本上,
系统
执行以下操作:

int pid, status, wait_pid;
char * shell;

shell = getenv ("SHELL");
if (shell == 0) {
   // Deal with missing SHELL environment variable problem
   return -1;
}

pid = fork();
if (pid < 0) {
    return -1;
}

else if (pid == 0) {
   execl (shell, shell, string_to_execute);
   return -1;
}

waited_pid = waitpid (pid, &status, wait_options);
if (waited_pid != pid) {
   return -1;
}

return status;
int-pid,状态,等待\u-pid;
字符*外壳;
shell=getenv(“shell”);
if(shell==0){
//处理缺少SHELL环境变量的问题
返回-1;
}
pid=fork();
if(pid<0){
返回-1;
}
否则如果(pid==0){
execl(shell,shell,字符串\u到\u执行);
返回-1;
}
waited_pid=waitpid(pid、状态和等待选项);
如果(等待的pid!=pid){
返回-1;
}
返回状态;
换句话说,基本上就是你想要的

编辑1
有一个问题是
系统
:它不安全,因为所有人都出去了。ArunMu已经提到了
rm-rf/
。如果某行包含
do\u something\u良性;rm-rf/
如果您可以信任文件的内容,使用
系统
就可以了。如果不是,最好使用perl或其他脚本语言,使其在安全模式下运行

编辑2

在评论中,什么因素促使你想要在C或C++中写这个?脚本语言,或者更好的是,makefile中的
测试
目标更适合这个问题。

你在哪里找到这个可怕的例子的?是的,应该有
=
我从中找到了这个例子。它看起来可疑,但我必须在明天早上之前完成,我现在没有任何东西可以在Linux pc上测试它。不,我不会那样做。所有的程序实际上都是由我编写的测试,它们发送一些CAN消息并在回调函数中处理响应。我需要做一些事情来自动化这个过程,只是要注意那些失败的。无需设置任何环境。Okies:)。那就去做吧。希望这方面的性能对您来说并不重要,因为如果有很多命令需要执行,那么对于每个命令,您都会[手动或使用system/popen]生成一个新的进程,这是一个代价高昂的操作。性能可能很重要。我想我会坚持这个制度。我仍然必须一次执行一个进程,因此我认为应该使用while(exitCode!=0 | | exitCode!=-1)//我的默认设置是通过和失败睡眠(variableDelay);//在进程完成之前不要占用任何资源,对吗?当您从系统命令中获取exitcode时,这意味着进程已完成执行[否则将如何获取exitcode:)]。你不必睡觉。@Johnny:那样的话,
make
怎么了?您正在运行一系列测试
make
做得很好。看起来不错,我如何解释退出状态?如果($?==0)echo“right”或…yes“$?”将为您提供上次运行命令的退出状态。“如果[$?-eq 0];那么echo“yes”;fi“Saphrosit提供的脚本将满足您的要求,除非您对c++中的代码有非常具体的要求。我相信两者都很好&很好。感谢您的快速响应!安全没有问题。我可以相信内容。要执行的程序已经在/usr/bin中,所以我认为应该没有路径问题。因此,您使用的字符串是向量的整行,不需要拆分,对吗?事实上,我不确定客户机更喜欢哪种类型(c或脚本)。此外,我可能会也可能不会被允许共享最终代码。
int pid, status, wait_pid;
char * shell;

shell = getenv ("SHELL");
if (shell == 0) {
   // Deal with missing SHELL environment variable problem
   return -1;
}

pid = fork();
if (pid < 0) {
    return -1;
}

else if (pid == 0) {
   execl (shell, shell, string_to_execute);
   return -1;
}

waited_pid = waitpid (pid, &status, wait_options);
if (waited_pid != pid) {
   return -1;
}

return status;