![进程标志 1:分叉但未执行(用例?)](https://linux22.com/image/84257/%E8%BF%9B%E7%A8%8B%E6%A0%87%E5%BF%97%201%EF%BC%9A%E5%88%86%E5%8F%89%E4%BD%86%E6%9C%AA%E6%89%A7%E8%A1%8C%EF%BC%88%E7%94%A8%E4%BE%8B%EF%BC%9F%EF%BC%89.png)
在 ps 的手册页中,它将进程标志 1 列为“进程分叉但未执行”。处于这种状态的流程的常见用例/情况是什么?
答案1
这句话指的是fork
和exec
系统调用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 中运行程序&
。
¹有些细微差别在这里并不重要,并且超出了本答案的范围。