进程标志 1:分叉但未执行(用例?)

进程标志 1:分叉但未执行(用例?)

在 ps 的手册页中,它将进程标志 1 列为“进程分叉但未执行”。处于这种状态的流程的常见用例/情况是什么?

答案1

这句话指的是forkexec系统调用1。系统fork调用通过复制调用进程来创建一个新进程:运行后fork,有两个进程,每个进程都有自己的内存,除了系统fork调用的返回值、进程 ID 和一些其他差异之外,它们的内容最初相同。系统exec调用从文件加载程序映像,并用该映像替换现有进程的内存。

通常意义上运行程序的方式是调用fork创建一个新进程供程序运行,然后调用exec子进程用新程序的代码和数据替换原始程序的副本。这是最常见的用法fork(通常是之前完成的一些操作,exec例如设置文件重定向)。

exec在没有执行 a 的情况下运行fork可以被视为执行fork+exec并让父级exit随后立即执行的优化。它并不完全等价,因为fork+ exec/exit更改了结果程序的父级,而 Straight 则exec不然。

Linux 的进程标志 1 表示未调用的进程,exec因为它们是由其父进程(即其程序的原始进程的子进程(或孙子进程等))分叉的。fork不打电话就打电话exec有多种用途。 (这不是详尽的列表,只是一些常见的用例。)

  • 有些程序利用多个处理器。这可以通过在同一进程中运行多个线程(然后所有线程共享内存)或通过在每个处理器上运行单独的进程(然后它们不共享内存)来完成。
  • 运行单独的进程是隔离某些任务的一种方法。例如,Chrome 将每个选项卡或每个小组选项卡保留在单独的进程中;这样,如果选项卡挂起或崩溃,或者网页触发安全漏洞,则不会影响其他进程显示的选项卡。单独的进程也可用于以不同的权限执行不同的任务;例如,OpenSSH 服务器以非特权用户身份运行其大部分代码,并且仅以 root 身份执行最终登录阶段。 shell用来fork实现子壳(脚本中变量、重定向等不影响主脚本的部分)。
  • 守护进程通常以“双分叉”开始:当程序运行时,它所做的第一件事就是fork,然后父程序退出。这与我上面提到的“优化”相反exec,这样做是为了将守护进程与其原始父进程隔离,特别是避免在原始父进程等待其子进程完成时阻塞原始父进程(例如,当您在没有 ) 的 shell 中运行程序&

¹有些细微差别在这里并不重要,并且超出了本答案的范围。

相关内容