关于你的问题:
在手册页中,它说execvp
用新的图像替换过程图像的图像。但是在这里我正在运行一个命令而不是可执行文件。
很久以前,shell 非常有限,几乎所有 UNIX 命令都是独立的可执行文件。现在,主要是出于速度目的,一些 UNIX 命令子集在 shell 本身内部实现,这些命令称为builtins
. 您可以通过命令检查在您的 shell 中实现的任何命令是否是内置的type
:
λ ~/ type echo
echo is a shell builtin
(带有描述的内置函数的完整列表可以在man
您的 shell 页面中找到,例如man bash-builtins
或man builtin
。)
但是大多数命令仍然有它们的可执行对应项:
λ ~/ whereis echo
/bin/echo
因此,在您运行时的特定情况下:
char* arg[] = {"ls", "-l", NULL};
execvp(arg[0],arg);
您实际上是用 (最有可能) 的地址空间替换当前进程的地址空间/bin/ls
。
我的直觉是我必须阅读文件并可能解析它以将参数存储在 arg 中。
确实你有。但是您也可以为此使用一些内核函数,即“shebang”:
不要将文件名放在单独的文件中,而是添加所谓的 shebang 作为您想要 cat 的文件的第一行:
#!/bin/cat
并添加chmod +x
到它。然后您可以将其作为可执行文件运行(通过任何exec
函数或 shell):
λ ~/tmp/ printf '#!/bin/cat\nTEST\n' > cat_me
λ ~/tmp/ chmod +x cat_me
λ ~/tmp/ ./cat_me
#!/bin/cat
TEST
当然,它有一个shebang
用文件打印自身的缺点,但在内核中执行它仍然很有趣=)
顺便提一句。您描述的问题很常见,以至于有一个称为特殊可执行文件xargs
(在非常简化的解释中)在通过标准输入传递的参数列表上执行给定程序。欲了解更多信息,请咨询man xargs
。
为了便于记忆exec
-family,我经常使用下表:
Figure 8.14. Differences among the six exec functions
+----------+----------+----------+----------+--------+---------+--------+
| Function | pathname | filename | agr list | argv[] | environ | envp[] |
+----------+----------+----------+----------+--------+---------+--------+
| execl | * | | * | | * | |
+----------+----------+----------+----------+--------+---------+--------+
| execlp | | * | * | | * | |
+----------+----------+----------+----------+--------+---------+--------+
| execle | * | | * | | | * |
+----------+----------+----------+----------+--------+---------+--------+
| execv | * | | | * | * | |
+----------+----------+----------+----------+--------+---------+--------+
| execvp | | * | | * | * | |
+----------+----------+----------+----------+--------+---------+--------+
| execve | * | | | * | | * |
+----------+----------+----------+----------+--------+---------+--------+
| letter | | p | l | v | | e |
+----------+----------+----------+----------+--------+---------+--------+
所以在你的情况下execvp
需要文件名,argv(v)和environ(e)。然后它尝试通过将filename
(在你的情况下cat
)附加到每个路径组件中来“猜测”路径名(又名完整路径),PATH
直到找到带有可执行文件的路径filename
。
在W. Richard Stevens 和 Stephen A. Rago aka APUE2的 UNIX 环境中的高级编程(第 2 版)exec
中可以找到更多关于 .
如果您对 UNIX 内部结构感兴趣,您可能应该阅读它。