【问题标题】:Execute a concatenation command with execvp使用 execvp 执行连接命令
【发布时间】:2018-11-28 14:41:28
【问题描述】:

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

"ls | tee ~/outputfile.txt"

我尝试运行以下代码,但收到此消息:execvp() not expected: No such file or directory 我不确定这个问题的原因, 我无法执行此命令,因为这是串联命令?

#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”的输出写入我的代码中的文件。

提前谢谢你!

【问题讨论】:

  • *exec*() 不是外壳。你可以*exec*("bash -c [whatever]")
  • 您可以使用system() 运行您的字符串。要使用execvp(),您需要解析它并创建管道并处理文件名的字扩展并进行I/O重定向。

标签: c linux


【解决方案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。 您可以在另一个 execve 中使用管道:this 可以极大地帮助您。

如果您只想执行命令行而不考虑安全性,可以使用“system

【讨论】:

    猜你喜欢
    • 2015-02-13
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 2021-06-01
    • 2021-11-26
    • 2021-12-06
    相关资源
    最近更新 更多