execlp多个“程序”

时间:2012-01-11 12:21:20

标签: c++ bash command pipe os.execl

我想运行像

这样的东西
cat file.tar | base64 | myprogram -c "| base64 -d | tar -zvt "

我使用execlp来运行该过程。

当我尝试运行类似cat的内容时,它会起作用,但如果我尝试运行base64 -d | tar -zvt则无效。

我查看了bash命令,发现我可以运行bash并告诉他运行其他程序。所以它就像:

execlp ("bash", "-c", "base64 -d | tar -zvt", NULL);

如果我在终端上运行它,它运行良好,但使用execlp它不起作用。 如果我使用execlp("cat", "cat", NULL)就行了。

有人知道如何在execlp上使用-c param来执行多个“程序”吗? 我不能使用系统,因为我使用管道和叉子。

现在我注意到,如果我尝试使用execlp(“bash”,“bash”,“ - c”,“base64”,NULL)......没有任何反应。 如果我使用execlp(“cat”,NULL),那没关系.. 我正在写stdin ...我不知道它是否与bash -c base64的问题..因为如果我在终端上运行echo“asd”| bash -c“cat” 它很顺利

1 个答案:

答案 0 :(得分:4)

第一个“参数”变为argv[0],所以你应该用类似的东西打电话:

execlp("bash", "bash", "-c", "base64 -d | tar -zvt", NULL);

编辑上述功能的一个小解释:exec系列函数执行程序。在上面的调用中,有问题的程序是“bash”(第一个参数)。与所有其他程序一样,Bash具有main函数,该函数是程序的起点。和所有其他main函数一样,Bash中的函数接收两个参数,通常称为argcargvargv是一个以零结尾的字符串数组,argcargv数组中的条目数。 argc始终至少为1,这意味着argv[0]始终有一个条目。第一个条目是程序的“名称”,通常是程序文件的路径。命令行上的所有其他程序参数都放入argv[1]argv[argc - 1]

execlp所做的是使用第一个参数来查找要执行的程序,所有其他参数将按照给定的顺序放入程序argv数组中。这意味着上面对execlp的调用将调用程序“bash”并将Bash的argv数组设置为:

argv[0] = "bash"
argv[1] = "-c"
argv[2] = "base64 -d | tar -zvt"

此外,Bash的argc将设置为3。

如果第二个"bash"更改为"foo",那么Bash的argv[0]也将设置为"foo"

我希望这一点能够清除它。