我正在寻找在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,因为我知道如何使用那个,但这可能引起我现在意识到的一些法律问题(共享代码没有问题,但我工作的公司可能不会允许那个)
感谢并期待从您那里得到答案!
答案 0 :(得分:0)
:
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
目标更适合这个问题。