System-Calls
何時自己呼叫 fork() 和 exec()?
我正在學習
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 用於產生一堆典型的工作程序(例如,Apache
httpd
在 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) 用於權限分離。