我正在写一个shell。
通过execvpe
系统调用,我可以运行程序并控制其环境。我需要在这里通过的最小值是什么?
或者,我理解子进程应该有他们父进程的副本,可能添加了一些值。在测试我的shell时,我是从bash中从我的终端内部从窗口管理器等运行它等等。我可以假设在我的环境中有哪些基本的基础知识?如果我直接从TTY运行我的shell("最低级别"据我所知),我能期待什么?
答案 0 :(得分:2)
这是一个非常广泛的问题。在某种程度上, 程序应该能够在没有环境的情况下运行。
DISPLAY
环境变量,
但也可以在命令行上传递。
可能还有其他必要的环境变量
(或几乎如此)到“X”程序;
我已经看了很久了。TERM
环境变量。
“特殊特征”意味着能够设置颜色
(ls
和grep
可以做,视选项而定),
在屏幕上移动(如vi
/ vim
),
甚至知道屏幕的大小(如less
)。
请注意,屏幕的大小也可以使用
通过ROWS
和COLUMNS
。TZ
) -
虽然,如果你愿意绝对(GMT / UTC),
你不需要这个。等
答案 1 :(得分:1)
您需要的最小是一个有效的PATH
变量。除此之外的任何额外内容取决于您要执行的程序。
POSIX has a list of commonly-used environment variables,很少有程序使用其中的几个。
通常,如果您使用 execvp * ,则不会为可执行文件提供完整路径名。它使您的程序更简单,您不必为每个可执行文件提供完整的路径名,正如 execv 所需。 POSIX将这些功能描述为
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
和(参考各种 exec * 函数的参数):
参数 path 指向标识新过程映像文件的路径名。
参数 file 用于构造标识新过程映像文件的路径名。如果 file 参数包含斜杠字符,则 file 参数将用作此文件的路径名。否则,通过搜索作为环境变量
PATH
传递的目录来获取此文件的路径前缀(请参阅XBD环境变量)。如果此环境变量不存在,则搜索结果为 实现定义 。
和(请记住,“file”指的是execvp
而不是execv
,因此environ
变量适用于使用 {的搜索“file”参数的{1}} :
对于那些不包含envp指针的表单(
PATH
,execl()
,execv()
,以及execlp()
),新过程映像的环境应从调用过程中的外部变量 environ 中获取。
所以......你可以在技术上删除整个 execvp()
变量,但结果将是 实现定义 。
答案 2 :(得分:1)
最小必要环境为空。你不需要任何东西。
e.g。
PATH
我们可以看到$ env -i env
$
创建了一个空白环境。
我们可以更进一步:
env -i
我们可以看到$ env -i /bin/bash
sweh@server:/home/sweh$ env
LS_COLORS=
PWD=/home/sweh
SHLVL=1
_=/usr/bin/env
设置了一些变量,但没有任何遗传。
现在这样的环境可能会破坏一些东西;例如缺少bash
变量意味着TERM
或vi
可能无法正常工作
less
所以,实际上,您需要确定您希望在环境中运行的程序以及它们的需求。