我一直在执行一个小程序,用execvp执行给定的命令()。 它不使用重定向时工作正常,但是当我运行一个命令,例如:
cat file1.txt > redirected.txt
猫输出下列错误消息和失败:
cat: >: No such file or directory
cat: redirected.txt: No such file or directory
我做了一些周围挖,我开始觉得,也许execvp()是不允许这样做的重定向,因为它不会在shell中运行。 这是否意味着我将不得不手动挑选出在重定向发生和使用的管道在我的叉子/ EXEC代码来绕过这个限制? 有没有更好的办法,而不是使用execvp()?
谢谢!
您的“执行给定的命令小程序”本质上是一个外壳。 既然你正在编写一个外壳,它是你的工作来实现你的愿望什么语法重定向。 该>
重定向操作符是不是内核的一个特点,它是一个壳特征。
为了实现sh
式的重定向,必须解析命令,找到重定向操作符,打开这些文件,并将它们分配到输入/输出描述符。 这必须在调用之前完成execvp
。 中查找dup2
系统调用。
您可以使用系统(),如果你真的想用那种语法。 正如你提到的,重定向和通配符扩展和一大堆其他的事情都是由在类Unix系统的外壳处理。
用叉子做的方式看起来是这样的:
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
。