C ++ - Linux / shell脚本运行子进程&得到他们的回归状态

时间:2011-07-31 09:23:32

标签: c++ linux bash process execute

我正在寻找在Linux上用C ++编写一个程序的解决方案,该程序解析包含带有set参数的程序的文件,然后使用其参数参数运行这些程序。

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

要解析的文本示例:

prog1 -a arg1 -m arg2 -c arg3 prog2 arg1 arg2 arg3 arg4 ....

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

vector <std::string> p_vector;
while (getline(file, line))
    p_vector.push_back(line);

然后,对于从0到p_vector.size()的每个元素,我需要做一些像我在网上找到的例子:

if(fork() = 0) //? shouldn't here be == ?
{
    execv(fullpath,argv);//does full path mean my p_vector[i]? or the child process and then argv is a list of space delimited arguments?
    exit(1);
}
else
{
    int *status;
    wait(status);
    if(*status == 0)
    printf("%s exited correctly", fullpath);//fullpath, right?
    else
    //other printf error
}

或者,我应该更好地使用这个

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 ++!

我本来可以使用Qt的QProcess,因为我知道如何使用那个,但这可能引起我现在意识到的一些法律问题(共享代码没有问题,但我工作的公司可能不会允许那个)

感谢并期待从您那里得到答案!

3 个答案:

答案 0 :(得分:0)

bash中的

echo file | while read command
do
   eval $command
done

其中file是包含每行代码的程序的文件

答案 1 :(得分:0)

我同意伊格纳西奥。但是如果你必须这样做,那么我更希望你使用System / popen命令。

但是请确认你没有运行任何会让你陷入困境的命令......比如“rm -rf *”。

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

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

答案 2 :(得分:0)

要使用exec家庭,您必须将p_vector[i]解析为令牌。第0个标记标识要执行的程序;剩下的指定程序的参数。 execvp模拟shell执行的操作:它在搜索路径中搜索程序。 execv希望您更进一步。您需要指定程序的路径,但不一定是完整路径;相对路径工作得很好。另一个关于exec的小问题:第0个参数应该是程序名的复制品。在这种情况下,这是很多工作。

基本上,system执行以下操作:

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;

换句话说,几乎就是你想要的。

编辑1
system有关的问题:当所有人都离开时,这是不安全的。 ArunMu已经提到了rm -rf /。如果某行包含do_something_benign; rm -rf /,如果您可以信任该文件的内容,那么使用system就可以了。如果没有,那么使用perl或其他一些可以在安全模式下运行的脚本语言会好得多。

编辑2
鉴于评论,导致您想用C或C ++编写的驱动因素是什么?脚本语言,甚至更好,makefile中的test目标更适合这个问题。