System-Calls

何時自己呼叫 fork() 和 exec()?

  • September 24, 2020

我正在學習fork()exec()命令。它似乎fork()並且exec()通常被稱為在一起。(fork()創建一個新的子程序,並exec()用新的程序映像替換目前程序映像。)但是,在什麼情況下您可以單獨呼叫每個函式?有沒有這樣的場景?

當然!“包裝”程序中的一個常見模式是做各種事情,然後用其他程序替換自己,只需要一個exec呼叫(沒有分叉)

#!/bin/sh
export BLAH_API_KEY=blub
...
exec /the/thus/wrapped/program "$@"

一個真實的例子是GIT_SSH(儘管如果您不想執行上述包裝程序方法,git(1)也可以提供)。GIT_SSH_COMMAND

Fork-only 用於產生一堆典型的工作程序(例如,Apachehttpd在 fork 模式下(儘管 fork-only 更適合需要消耗 CPU 的程序,而不是那些在等待網路 I/O 發生時擺弄拇指的程序) ) 或用於OpenBSD 上的其他程序使用的權限分離(無 exec)sshd

$ doas pkg_add pstree
...
$ pstree | grep sshd
|-+= 70995 root /usr/sbin/sshd
| \-+= 28571 root sshd: jhqdoe [priv] (sshd)
|   \-+- 14625 jhqdoe sshd: jhqdoe@ttyp6 (sshd)

sshd 在客戶端連接上分叉了它自己的root一個副本 (28571),然後是另一個副本 (14625) 用於權限分離。

引用自:https://unix.stackexchange.com/questions/398944