2

我想运行类似的东西

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)它就可以了。

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

现在我注意到,如果我尝试使用 execlp("bash", "bash", "-c", "base64", NULL)... 什么也没有发生。如果我使用 execlp("cat", NULL) 没关系..我正在写入标准输入...我不知道 bash -c base64 是否有问题..因为如果我在终端回显上运行“asd” | bash -c "cat" 一切顺利

4

1 回答 1

4

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

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

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

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

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

此外,argcBash 将设置为 3。

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

我希望这能澄清一点。

于 2012-01-11T12:39:06.423 回答