Possible Duplicate:
Writing a shell - how to execute commands
我的任务是用 C 编写一个 shell。到目前为止,我了解到 execvp 将尝试以 arg2 作为参数在 arg1 中运行程序。现在看来,这样做
execvp ("ls", args); //assume args is {"ls", ">", "awd.txt"}
不等同于在控制台中输入
ls > awd.txt
我意识到我需要使用 freopen 来获得相同的结果,但我很好奇 execvp 在做什么。
exec
函数族最终是一个系统调用。系统调用直接进入内核,通常执行只有内核才能执行的非常具体的服务。
另一方面,重定向是一个 shell 特性。
因此,当在 shell 中键入 ls > awd.txt
时,shell 首先执行 fork(2)
,然后它会关闭子进程中的标准输出,然后它在文件描述符 1 上打开 awd.txt
,使其成为新的标准输出。
然后,只有到那时,shell 才会进行 exec-
系列系统调用。
在您的情况下,您只需将字符串 >
和 awd.txt
传递给 exec 系统调用,然后从那里传递给 ls
。顺便说一句,请确保使用空指针终止 execvp arg 数组。
注意:如您所见,执行的程序永远不会看到重定向运算符。在 Unix 之前,将输出定向到文件必须由每个基于选项的程序来完成。更多琐事:大多数程序永远不知道它们被重定向了,但具有讽刺意味的是,ls
确实检查它的输出是否是 tty,如果是,它会执行多列格式化输出的东西。