带有 shell 输出重定向的 execvp shell 命令不起作用

execvp shell command with shell output redirection does not work

我开发了以下代码: 主要:

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

int main()
{
    char *const args[] = {"/bin/ls", "> test.txt 2>&1", NULL};
    execvp(args[0], args);

    /* If this is reached execvp failed. */

    perror("execvp");
    return 0;
}

我需要执行此 shell 命令:/bin/ls > test.txt 2>&1 但我有一个错误:

$gcc -o main main.c 
$ vi main.c
$ gcc -o main main.c 
$ ./main 
/bin/ls: cannot access '> test.txt 2>&1': No such file or directory
$ 

为什么 returns /bin/ls: cannot access '> test.txt 2>&1': No such file or directory ?您有解决该问题的解决方案吗?

不,那行不通。重定向是您 shell 的一项功能。通过使用 exec 函数之一,您可以完全绕过 shell。所以你需要自己处理重定向。

int out = open("test.txt", O_WRONLY | O_CREAT, 0644);
dup2(out, 1);
dup2(out, 2);
close(out);
execvp(args[0], args);

但首先删除 args 中的第二项。

这将打开输出文件并将其复制到标准输入和标准输出,就像 shell 所做的那样。最后关闭原始描述符,因为不再需要它。

我省略了错误检查,但你当然应该添加它。

重定向由 shell 解释。但是 execvp() 不会 运行 一个 shell。它 运行 是一个可执行文件。您可以通过调用“sh -c”来执行 system() 内部完成的操作:

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

int main(void)
{
    char *const args[] = {"/bin/sh", "-c", "/bin/ls > test.txt 2>&1", NULL};
    execvp(args[0], args);

    /* If this is reached execvp failed. */

    perror("execvp");
    return 0;
}