【问题标题】:execlp multiple "programs"execlp 多个“程序”
【发布时间】:2012-02-07 19:13: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) 没关系.. 我正在写信给标准输入......我不知道它是否是 bash -c base64 的问题......因为如果我在终端上运行 echo "asd" | bash -c“猫” 一切顺利

【问题讨论】:

  • 我已经向in a previous answer 展示了如何使用管道链接任意数量的进程。希望对您有所帮助。
  • 我想过,我正在尝试用 bash 解决它,如果我不能这样做,我会尝试多管道方式:(...谢谢。

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


【解决方案1】:

第一个“参数”变成了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"

我希望这能澄清一点。

【讨论】:

  • 为什么我需要调用 bash 2 次?
  • @user1109847 bash 只调用一次,但必须在 bash 的main() 函数中包含零参数。
  • 我用 bash 再次调用 bash?
  • @user1109847 在您自己的程序中,main 函数有两个参数:argcargvargvchar * 上的一个数组,其中argv[0] 是您的程序的名称。 execlp 的第一个参数是实际程序,其余的是放入执行程序的argv 数组中的值。阅读manual page 几次,并尝试使用argcargv 参数到main
  • @user1109847 扩展了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 2016-05-21
  • 2016-09-22
  • 1970-01-01
相关资源
最近更新 更多