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);
但这似乎不是一个好主意。