在
#include <unistd.h>
int execve(const char * pathname , char *const argv [], char *const envp []);
argv [0]
ofexecve
对应于argv[0]
新程序的主函数,因此通常与pathname
参数的基本名称部分相同。这是我们应该始终遵循的要求吗?
当程序文件可以通过不同的值调用时argv[0]
,该规则/约定是否意味着当我调用程序文件并希望argv[0]
其main()
具有特定值时,我必须创建一个指向以值命名的程序文件的符号链接argv[0]
,并通过符号链接调用程序?还是不一定?例如,这是“为什么 argv 包含程序名称?”的答案说
argv[0]
当是 时,Bash 以 POSIX 模式运行sh
。当argv[0]
以 开头时,它作为登录 shell 运行-
。
这是否意味着
要在 POSIX 模式下调用 bash,我必须创建一个符号链接
/path/to/sh
并/bin/bash
通过execve("/path/to/sh", argv, ...)
指向argv[0]
string"sh"
?来调用 bash这种方式比execve("/bin/bash", argv, ...)
whereargv[1]
指向字符串"--posix"
并且argv[0]
无关紧要更好吗?要调用 bash 作为登录 shell,我必须创建一个符号链接
/path/to/-
并/bin/bash
通过execve("/path/to/-", argv, ...)
指向argv[0]
string"-"
?来调用 bash。这种方式是否比指向字符串的execve("/bin/bash", argv, ...)
位置更可取并且无关紧要?argv[1]
"--login"
argv[0]
argv [0]
of execve
is什么时候有用不一样作为pathname
参数的基本名称组成部分?
答案1
您链接到的问题的接受答案说
首先,请注意这
argv[0]
不一定是程序名称。
这解决了你的主要问题。
您关于启动计划的各种问题似乎源于误解。您不需要使用链接(符号链接或硬链接)来启动argv[0]
设置为名称以外的值的程序;您需要能够控制给予 的数组execve
。这就是login
启动 shell 时所做的事情:它以-
in为前缀argv[0]
。
argv[0]
Bash 在启动时以 POSIX 模式启动sh
,因此可以用作/bin/sh
.如果需要使用--posix
,则需要更改大量 shell 脚本。
同样的推理也适用于-
登录 shell:此约定适用于任何 shell,无论它--login
是否支持选项。
登录用例是一个argv[0]
不等于程序名称很有用的例子。