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

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

cat file1.txt > redirected.txt 

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

 cat: >: No such file or directory cat: redirected.txt: No such file or directory 

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

谢谢!

您的“执行给定命令的小程序”本质上是一个shell。 由于您正在编写shell,因此您可以使用所需的任何语法实现重定向。 >重定向运算符不是内核的一个特性,它是一个shell特性。

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

如果您真的想使用那种语法,可以使用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. */ } 

看起来最简单的事情是:

 execlp( "/bin/sh", "/bin/sh", "-c", "cat file1.txt > redirected.txt", (char *)NULL ); 

你可以用execvp做同样的事情。