fork()とexec()はいつ別々に呼び出されますか?

fork()とexec()はいつ別々に呼び出されますか?

私は学び、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を消費する必要があるプロセスに適しています))または〜のため特権の分離sshdOpenBSDのプログラムやその他のプログラムで使用される(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)をフォークします。

おすすめ記事