私は学び、fork()
命令しexec()
ています。ルックスfork()
とexec()
通常一緒に呼び出されます。 (fork()
新しいサブプロセスを作成し、exec()
現在のプロセスイメージを新しいプロセスイメージに置き換えます。)しかし、どのような状況で各関数を個別に呼び出すことができますか?そんなシナリオはありますか?
ベストアンサー1
確かに! 「ラッパー」プログラムの一般的なパターンは、さまざまな操作を実行してからexec
呼び出しだけで別のプログラムに置き換えることです(パッキングなし)。
#!/bin/sh
export BLAH_API_KEY=blub
...
exec /the/thus/wrapped/program "$@"
実際の例は次のとおりです(GIT_SSH
上記のラッパーアプローチを実行したくない場合はgit(1)
提供できます)。GIT_SSH_COMMAND
フォーク専用は、いくつかの一般的なワーカープロセスを生成するために使用されます(たとえば、フォークhttpd
モードのApache(フォーク専用は、ネットワークI / Oが発生するのを待つプロセスよりもCPUを消費する必要があるプロセスに適しています))または〜のため特権の分離sshd
OpenBSDのプログラムやその他のプログラムで使用される(execなし)
$ 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)をフォークします。