操作系统概念和 APUE 说
使用vfork(),父进程被挂起,子进程使用父进程的地址空间。因为 vfork() 不使用写时复制,如果子进程更改了父地址空间的任何页面,一旦恢复,父进程将可以看到更改的页面。因此,必须谨慎使用 vfork(),以确保子进程不会修改父进程的地址空间。
vfork() 旨在在子进程创建后立即调用 exec() 或 exit() 时使用。
我该如何理解最后一句话?
当vfork()调用创建的子进程时exec(),不会exec()通过加载新程序来修改父进程的地址空间?
当一个子进程的创建vfork()调用exit(),并 exit()终止儿童在不修改父进程的地址空间?
我更喜欢Linux。
谢谢。
我在 bash 脚本中有这个:
exit 3;
exit_code="$?"
if [[ "$exit_code" != "0" ]]; then
echo -e "${r2g_magenta}Your r2g process is exiting with code $exit_code.${r2g_no_color}";
exit "$exit_code";
fi
Run Code Online (Sandbox Code Playgroud)
看起来它会在退出命令后立即退出,这是有道理的。我想知道是否有一些简单的命令可以提供退出代码而无需立即退出?
我猜:
exec exit 3
Run Code Online (Sandbox Code Playgroud)
但它给出了一条错误消息:exec: exit: not found。我能做什么?:)
我在这个线程中看到了以下片段:How to change from csh to bash as default shell
sleep 2
if (-x /usr/local/bin/bash) then
exec /bin/sh -c '. ~/.profile; exec /usr/local/bin/bash'
endif
Run Code Online (Sandbox Code Playgroud)
我的理解是,如果您将此代码段放入~/.login其中,它将bash在您登录时调用。
我有一个类似的情况,我想使用一个类似的片段来调用zsh一个与我登录时使用的默认版本不同的版本。我遇到这个麻烦的部分原因是因为我无法选择zsh中允许的选项中我想要的版本,但chsh我没有管理员权限。
有了这个:
exec上面的代码片段中需要两个命令?他们在做什么?另外,为什么上面的代码片段使用sh 和 bash(用户应该用 登录csh)假设setuid/setgid位无关紧要。为什么有单独的执行权限?
从哲学上讲,我觉得写权限包含读权限,读权限包含执行权限。当然,在 Linux 中情况并非如此,这有时可能很有用,但我认为这种情况很少见。例如,如果一个进程可以读取一个不可执行的文件,那么只要该进程可以写入某个目录,它就可以简单地将文件复制到那里,设置执行位,然后运行该程序。所以说真的,read subsumes 在简单的情况下执行。显然,如果源文件有 setuid 位,或者进程只能写入 noexec 挂载点,这将无法正常工作。
我问的原因是我正在实现一个 Linux 系统调用,它允许进程访问exec其内存的任意块。(具体用例是我的主程序中捆绑了一个完整的程序,我不想将其写入磁盘以调用execve.)这样的系统调用是否存在任何我应该注意的严重问题? ?
我正在学习fork()和exec()命令。它似乎fork()和exec()通常被称为在一起。(fork()创建一个新的子进程,并exec()用一个新的进程映像替换当前进程映像。)但是,在什么情况下您可以单独调用每个函数?有这样的场景吗?
我正在尝试整理以下片段,设计目标是记录脚本的所有输出,而不应该是包装器。线越少越好。
我不关心用户输入(在这个阶段),目标脚本以非交互方式运行。
片段需要
目前,我有以下内容仅在最新版本的 bash (4.2+?) 下测试,如 Ubuntu 精确,但在 CentOS6 上行为不端。
DEBUG_LOG="${0##*/}.log"
# copy stdout to log always and echo to console
exec > >(tee -a ${DEBUG_LOG})
# copy stderr to log only, unless debugging is enabled
[ $DEBUG_TEST = "true" ] \
&& exec 2> >(tee -a ${DEBUG_LOG} >&2) \
|| exec 2>> ${DEBUG_LOG}
Run Code Online (Sandbox Code Playgroud)
那么这...
# Expand escaped characters, wrap at 70 chars on spaces,
# and indent wrapped lines
msg_log() {
echo …Run Code Online (Sandbox Code Playgroud) 当我在 Linux Box 上时,我使用 bash 作为 shell。现在我想知道 bash 如何处理 ELF 文件的执行,即当我输入 ./program 并且 program 是一个 ELF 文件时。我搜索了 bash-4.3.tar.gz,似乎没有某种幻数解析器来确定文件是否为 ELF,也没有找到 exec() 系统调用。
整个进程如何运作?bash 如何将 ELF 的执行传递给操作系统?
默认情况下,文件描述符在 exec 函数中保持打开状态。对于描述符 0-2 的好处也许是可以理解的。但是是否有保持其他描述符打开的实际用例?是否有任何真正的应用程序依赖于这个事实?
我看到SHELL环境变量有两种可能的用途:
/bin/sh -c "..."惯用语中的命令。如果只用于前者,可能会很奇怪(例如ipython),如果它也用于后者,则需要提供POSIX兼容性的基本形式,例如理解-c参数并保持环境完整(这是令人惊讶的棘手)。
该POSIX标准也不是很明确的在这里,它只是写道。
该变量应代表用户首选命令语言解释器的路径名。如果此解释器不符合 IEEE Std 1003.1-2001 第 2 章 Shell 命令语言的 Shell 和实用程序卷中的 Shell 命令语言,实用程序的行为可能与 IEEE Std 1003.1-2001 中描述的不同。
第二次使用是否真的常见和/或有效,因此如果我设置SHELL为奇怪的东西需要担心?
创建自定义菜单项,卡在这个命令上:
exec tail -n +3 $0
Run Code Online (Sandbox Code Playgroud)
在终端中尝试过,得到了奇怪的结果,无法理解,这个命令究竟做了什么以及为什么 grub 需要它。请你解释一下好吗?
exec ×10
bash ×3
shell ×3
executable ×2
exit ×2
shell-script ×2
system-calls ×2
c ×1
elf ×1
exit-status ×1
fork ×1
grub2 ×1
kernel ×1
linux ×1
linux-kernel ×1
login ×1
logs ×1
permissions ×1
posix ×1
process ×1
tail ×1
vfork ×1
zsh ×1