我想运行像
这样的东西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” 它很顺利
答案 0 :(得分:4)
第一个“参数”变为argv[0]
,所以你应该用类似的东西打电话:
execlp("bash", "bash", "-c", "base64 -d | tar -zvt", NULL);
编辑上述功能的一个小解释:exec
系列函数执行程序。在上面的调用中,有问题的程序是“bash”(第一个参数)。与所有其他程序一样,Bash具有main
函数,该函数是程序的起点。和所有其他main
函数一样,Bash中的函数接收两个参数,通常称为argc
和argv
。 argv
是一个以零结尾的字符串数组,argc
是argv
数组中的条目数。 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"
。
我希望这一点能够清除它。