1

可能重复:
编写 shell - 如何执行命令

我的任务是用 C 编写一个 shell。到目前为止,我知道 execvp 将尝试在 arg1 中以 arg2 作为参数运行程序。现在看来,这样做

execvp ("ls", args); //assume args is {"ls", ">", "awd.txt"}

不等于在控制台中输入这个

ls > awd.txt

我意识到我需要使用 freopen 来获得相同的结果,但我很好奇 execvp 在做什么。

4

3 回答 3

2

exec函数族最终是一个系统调用。系统调用直接进入内核,通常执行只有内核才能执行的非常特定的服务。

另一方面,重定向是一个 shell 特性。

因此,当在 shell 中键入ls > awd.txt一个时,shell 首先执行 a fork(2),然后关闭子项中的标准输出,然后awd.txt在文件描述符上打开一个,以便它成为新的标准输出。

然后,并且只有这样,shell 才会进行exec-家庭系统调用。

在您的情况下,您只需将字符串传递给 exec 系统调用,>然后awd.txt从那里传递给ls. 顺便说一句,请确保使用空指针终止 execvp arg 数组。


注意:如您所见,重定向运算符永远不会被执行的程序看到。在 Unix 之前,每个程序都必须根据选项将输出定向到文件。更多琐事:大多数程序从不知道它们被重定向,但具有讽刺意味的是,ls 它确实检查它的输出是否是一个 tty,如果是,它会执行多列格式化输出的事情。

于 2013-01-27T04:45:10.503 回答
0

ls使用 2 个参数执行:>awd.txt. 相当于运行:

'ls' '>' 'awd.txt'
于 2013-01-27T04:46:10.193 回答
0

您可以将命令直接传递给 shell:

char * const args[] = { "sh", "-c", "ls > awd.txt", NULL};
execvp("/bin/sh", args);

但这似乎不是一个好主意。

于 2013-01-27T04:53:20.830 回答