使用execvp执行并置命令

时间:2018-11-28 14:41:28

标签: c linux

如果可能,如何使用execvp执行以下命令:

  

“ ls | tee〜/ outputfile.txt”

我试图运行以下代码,但收到此消息:execvp()意外出现:没有此类文件或目录 我不确定造成此问题的原因, 我无法执行此命令,因为这是串联命令?

#include <unistd.h> // execvp()
#include <stdio.h>  // perror()
#include <stdlib.h> // EXIT_SUCCESS, EXIT_FAILURE


int main(void) {
char *const cmd[] = {"ls | tee ~/outputfile.txt", NULL};
execvp(cmd[0], cmd);
perror("Return from execvp() not expected");

exit(EXIT_FAILURE);
}

在最底下,要将命令“ ls”的输出写入我代码中的文件中。

提前谢谢!

1 个答案:

答案 0 :(得分:1)

您不能像这样使用execvp(或任何exec *函数族)。 首先,第一个参数必须是可执行文件的路径。 我怀疑你有一个'ls | tee〜/ outputfile.txt”可执行文件放在计算机上的某个位置。 您可能有“ ls”或“ tee”,但没有“ ls | tee〜/ outputfile.txt'。

其次:exec *函数系列不能自然地进行管道传递(“ |”部分):您必须自己完成。

一个例子如下:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char *const cmd[] = {"ls", "/home", NULL};
    execvp(cmd[0], cmd);
    perror("Return from execvp() not expected");

    exit(EXIT_FAILURE);
}

这将在“ / home”中执行ls。 您可以将它传递给另一个执行程序:this可以极大地帮助您。

如果您只想在不考虑安全性的情况下执行命令行,则可以使用“ system