execvp实际上做了什么?

时间:2013-01-27 04:42:36

标签: c shell exec execvp

  

可能重复:
  Writing a shell - how to execute commands

我的任务是在C中编写一个shell。到目前为止,我理解execvp将尝试在arg1中运行程序,并使用arg2作为参数。现在好像这样做

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

不等于在控制台中输入

ls > awd.txt

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

3 个答案:

答案 0 :(得分:2)

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

另一方面,

重定向是一个shell功能。

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

然后,只有这样,shell才会进行exec-系列调用。

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


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

答案 1 :(得分:0)

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

'ls' '>' 'awd.txt'

答案 2 :(得分:0)

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

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

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