调用execvp()内部的重定向无法正常工作

Gre*_* S. 4 c fork exec io-redirection

我一直在实现一个使用execvp()执行给定命令的小程序.不使用重定向时它工作正常,但是当我运行如下命令时:

cat file1.txt > redirected.txt
Run Code Online (Sandbox Code Playgroud)

cat输出以下错误消息并失败:

cat: >: No such file or directory
cat: redirected.txt: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我已经做了一些挖掘,我开始认为也许execvp()不允许进行重定向,因为它不在shell中运行.这是否意味着我必须在重定向发生时手动选择并在fork/exec代码中使用管道来解决这个限制?有没有比使用execvp()更好的方法?

谢谢!

use*_*342 8

您的"执行给定命令的小程序"本质上是一个shell.由于您正在编写shell,因此您可以使用所需的任何语法实现重定向.该>重定向操作符是不是内核的一个特点,它是一个壳特征.

要实现sh样式重定向,您必须解析命令,找到重定向运算符,打开文件并将它们分配给输入/输出描述符.这必须致电之前完成execvp.查找dup2系统调用.


tmy*_*ebu 5

如果您确实想使用这种语法,则可以使用system()。如您所述,重定向和通配符扩展以及许多其他事情由类Unix系统上的Shell处理。

用fork做到的方式看起来像这样:

int kidpid;
int fd = open("redirected.txt", O_WRONLY|O_TRUNC|O_CREAT, 0644);
if (fd < 0) { perror("open"); abort(); }
switch (kidpid = fork()) {
  case -1: perror("fork"); abort();
  case 0:
    if (dup2(fd, 1) < 0) { perror("dup2"); abort(); }
    close(fd);
    execvp(cmd, args); perror("execvp"); abort();
  default:
    close(fd);
    /* do whatever the parent wants to do. */
}
Run Code Online (Sandbox Code Playgroud)