execvp实际上做了什么?

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

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

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

不等于在控制台中键入它

 ls > awd.txt 

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

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

另一方面,重定向是一个shellfunction。

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

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

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


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

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

 'ls' '>' 'awd.txt' 

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

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

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