c - execvp 实际上做了什么?

标签 c shell exec execvp

<分区>

Possible Duplicate:
Writing a shell - how to execute commands

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

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

不等同于在控制台中输入

ls > awd.txt

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

最佳答案

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

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

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

然后,只有到那时,shell 才会进行 exec- 系列系统调用。

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


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

关于c - execvp 实际上做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14544501/

相关文章:

使用较新的编译器编译 linux 2.6 内核模块

c - malloc 有时会失败。或者 pread 有时会失败

bash - 使用 bash 检查一行是否为空

java - 如何从 java 控制台运行控制台应用程序?

c - 数组的迭代/递归搜索

C编程: how to fill an array?

shell - Emacs 默默地将 -i 附加到 shell 命令

linux - linux下将文件从一个路径复制到另一个路径

php - 通过 PHP exec 传递变量

linux - 为什么 RLIMIT_STACK 在 linux 上 fork 或 exec 后丢失?