执行多个"programs"

execlp multiple "programs"

本文关键字:programs 执行      更新时间:2023-10-16

我想运行类似的程序

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参数来执行多个"程序"?我不能使用系统,因为我使用管道和叉子。

现在我注意到,如果我尝试使用execlp("bash"、"bash"、"-c"、"base64"、NULL)。。。什么也没发生。如果我使用execlp("cat",NULL),那没关系。。我正在给stdin写信。。。我不知道bash-c base64是否有问题。因为如果我在终端echo"asd"|bash-c"cat"上运行运行良好

第一个"参数"是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"

我希望这能稍微澄清一下。