标签: exec

当子进程在创建后立即调用 exec() 或 exit() 时,为什么要使用 vfork()?

操作系统概念和 APUE 说

使用vfork(),父进程被挂起,子进程使用父进程的地址空间。因为 vfork() 不使用写时复制,如果子进程更改了父地址空间的任何页面,一旦恢复,父进程将可以看到更改的页面。因此,必须谨慎使用 vfork(),以确保子进程不会修改父进程的地址空间。

vfork() 旨在在子进程创建后立即调用 exec() 或 exit() 时使用。

我该如何理解最后一句话?

vfork()调用创建的子进程时exec(),不会exec()通过加载新程序来修改父进程的地址空间?

当一个子进程的创建vfork()调用exit(),并 exit()终止儿童在不修改父进程的地址空间?

我更喜欢Linux。

谢谢。

linux process exit exec vfork

11
推荐指数
1
解决办法
4200
查看次数

捕获退出命令的退出码

我在 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。我能做什么?:)

bash shell-script exit exec exit-status

10
推荐指数
3
解决办法
5273
查看次数

在没有 chsh 或管理员权限的情况下更改默认 shell

我在这个线程中看到了以下片段: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我没有管理员权限。

有了这个:

  • 在不同版本的 zsh 之间切换时,如何更改上面的代码片段以执行此操作?
  • 为什么exec上面的代码片段中需要两个命令?他们在做什么?另外,为什么上面的代码片段使用sh bash(用户应该用 登录csh

shell login zsh exec

9
推荐指数
1
解决办法
3万
查看次数

执行权限的目的是什么?

假设setuid/setgid位无关紧要。为什么有单独的执行权限?

从哲学上讲,我觉得写权限包含读权限,读权限包含执行权限。当然,在 Linux 中情况并非如此,这有时可能很有用,但我认为这种情况很少见。例如,如果一个进程可以读取一个不可执行的文件,那么只要该进程可以写入某个目录,它就可以简单地将文件复制到那里,设置执行位,然后运行该程序。所以说真的,read subsumes 在简单的情况下执行。显然,如果源文件有 setuid 位,或者进程只能写入 noexec 挂载点,这将无法正常工作。

我问的原因是我正在实现一个 Linux 系统调用,它允许进程访问exec其内存的任意块。(具体用例是我的主程序中捆绑了一个完整的程序,我不想将其写入磁盘以调用execve.)这样的系统调用是否存在任何我应该注意的严重问题? ?

permissions system-calls executable linux-kernel exec

9
推荐指数
2
解决办法
2934
查看次数

什么时候自己调用 fork() 和 exec()?

我正在学习fork()exec()命令。它似乎fork()exec()通常被称为在一起。(fork()创建一个新的子进程,并exec()用一个新的进程映像替换当前进程映像。)但是,在什么情况下您可以单独调用每个函数?有这样的场景吗?

system-calls fork exec

9
推荐指数
2
解决办法
6165
查看次数

重定向和记录脚本输出

我正在尝试整理以下片段,设计目标是记录脚本的所有输出,而不应该是包装器。线越少越好。

我不关心用户输入(在这个阶段),目标脚本以非交互方式运行。

片段需要

  • 输出标准输出到日志,并始终回显到控制台
  • 如果启用了调试,则输出 stderr 到日志,并回显到控制台
  • stderr 消息应该以时间戳和其他用途为前缀

目前,我有以下内容仅在最新版本的 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)

bash logs shell-script exec

8
推荐指数
1
解决办法
5774
查看次数

bash 如何执行 ELF 文件?

当我在 Linux Box 上时,我使用 bash 作为 shell。现在我想知道 bash 如何处理 ELF 文件的执行,即当我输入 ./program 并且 program 是一个 ELF 文件时。我搜索了 bash-4.3.tar.gz,似乎没有某种幻数解析器来确定文件是否为 ELF,也没有找到 exec() 系统调用。

整个进程如何运作?bash 如何将 ELF 的执行传递给操作系统?

bash kernel executable elf exec

8
推荐指数
1
解决办法
2万
查看次数

跨 exec 的文件描述符

默认情况下,文件描述符在 exec 函数中保持打开状态。对于描述符 0-2 的好处也许是可以理解的。但是是否有保持其他描述符打开的实际用例?是否有任何真正的应用程序依赖于这个事实?

c file-descriptors exec

8
推荐指数
2
解决办法
8426
查看次数

$SHELL 环境变量是否仅适用于交互式 shell?

我看到SHELL环境变量有两种可能的用途:

  • 它可用于指定用户想要使用的交互式shell,和/或
  • 进程可以使用它来执行其他命令,替换通常/bin/sh -c "..."惯用语中的命令。

如果只用于前者,可能会很奇怪(例如ipython),如果它也用于后者,则需要提供POSIX兼容性的基本形式,例如理解-c参数并保持环境完整(这是令人惊讶的棘手)。

POSIX标准也不是很明确的在这里,它只是写道。

该变量应代表用户首选命令语言解释器的路径名。如果此解释器不符合 IEEE Std 1003.1-2001 第 2 章 Shell 命令语言的 Shell 和实用程序卷中的 Shell 命令语言,实用程序的行为可能与 IEEE Std 1003.1-2001 中描述的不同。

第二次使用是否真的常见和/或有效,因此如果我设置SHELL为奇怪的东西需要担心?

shell posix exec

8
推荐指数
1
解决办法
576
查看次数

grub2 配置中的命令“exec tail -n +3 $0”有什么逻辑?

创建自定义菜单项,卡在这个命令上:

exec tail -n +3 $0
Run Code Online (Sandbox Code Playgroud)

在终端中尝试过,得到了奇怪的结果,无法理解,这个命令究竟做了什么以及为什么 grub 需要它。请你解释一下好吗?

shell tail grub2 exec

8
推荐指数
2
解决办法
2190
查看次数