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

Gre*_*hal 2 process fork

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

Gil*_*il' 5

这句话指的是forkexec系统调用¹。该fork系统调用创建通过复制调用进程的新进程:运行之后fork,有两个过程,每个都有自己的memory¹与除返回值最初,内容相同的fork系统调用,进程ID和其它差别很少. 该exec系统调用从文件中装载,并替换了由图像现有进程的内存中的程序映像。

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

exec不做 afork就运行可以看作是对做fork+exec并让父级在exit之后立即做的优化。它并不完全等效,因为fork+ exec/exit更改了结果程序的父级,而直式exec则没有。

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

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

¹有一些细微差别在这里无关紧要,超出了本答案的范围。