我的任务是在C中编写一个shell。到目前为止,我理解execvp将尝试在arg1中运行程序,并使用arg2作为参数。现在好像这样做
execvp ("ls", args); //assume args is {"ls", ">", "awd.txt"}
不等于在控制台中输入
ls > awd.txt
我意识到我需要使用freopen来实现相同的结果,但我很好奇execvp正在做什么。
答案 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);
但这似乎不是一个好主意。