gccを使用してプログラムをコンパイルしてbashシェルで実行しようとすると、bashがそれを実行する手順の正確な順序は何ですか?
私はそれがfork()
、、、、(および他のもの)に関連していることを知っていますが、誰かが正しい手順の順序と適切な読書資料を提供できますかexecve()
?loader
dynamic linker
編集する:
答えを見ると、この質問には多くの可能性が含まれているようです。簡単なケースで範囲を絞りたいです。
(test.cはhello worldを印刷します)
$ gcc test.c -o test
$ ./test
上記の状況()のステップは何ですか./test
?特に、ロード、リンクなどの一部のサブプロセスでbashプログラムを起動しますか?
答え1
/usr/libexec/foo
さて、実際のプログラムを実行する前に最初に拡張/解釈されるシェルエイリアスや関数があるかもしれません。あります。ディレクトリ環境PATH
変数(ただfoo
)。さらに、実行の詳細は、foo | bar | zot
シェルが同様のものよりも多くのタスク(もちろん、いくつか、fork(2)
および他のシステムコール)を実行する必要があるため、状況を複雑にすることができます。これはシェルが自分自身を呼び出すので、はるかに少ない作業が必要です。新しいプログラム(つまり、そうではありません)。また、プロセスグループ(特にフォアグラウンドプロセスグループ、誰かがマッシングを開始したときにすべてのPIDを取得する)、セッションとタスクがバックグラウンドで実行されるか、監視されるか()、または無視されるか()も重要です。背景。 / Oリダイレクトの詳細は、標準入力がshell()によって閉じられるかどうか、ファイルがstdin()で開かれるかどうかなども変更します。dup(2)
pipe(2)
exec foo
fork
SIGINT
CtrlCfoo &
foo & disown
foo <&-
foo < blah
strace
あるいは、同様のものは、このプロセス中に実行された特定のシステムコールに関する情報を提供し、各コールのマニュアルページが必要です。適切なシステムレベルの読み取りは、Stevensの「UNIX環境の高度なプログラミング」の章の1つであり、シェルブック(「BashからZシェルまで」など)では、シェルの側面について詳しく説明します。
答え2
コードをわかりやすくするために、教科書のサンプルシェルがすでに実行されていると仮定した場合(したがって動的リンカーが完成している)、上記のコマンドを使用するには、シェルで次のシステムコールを実行する必要があります。
- 読み取り:この場合、次のコマンドgccを取得します。
- フォーク:2つのプロセスが必要です。親プロセスのpidは500で、子プロセスは説明に使用されます。
- 親プロセスはwait(501)を呼び出し、子プロセスはexecを呼び出します。この時点で、シェルはPID 501で実行されなくなりました。 gcc は、少なくともオープン、クローズ、リード、ライト、chmod、フォーク、ラン、スタンバイ、シャットダウンなど、多数のシステムコールを実行します。
- gccがexitを呼び出すとwaitが返され、writeを呼び出してプロンプトを表示してからプロセスを繰り返します。
もちろん、より複雑なコマンドはこの基本シーケンスの複雑さを高めます。基本的な複雑さの2つの簡単な例は、基本的なioリダイレクトです。ここでは、オープン、クローズ、ダンプシーケンスがフォークとexecの間に挿入され、バックグラウンドプロセスでは待機をスキップします(そして別の待機はsigchldハンドラに追加されます)。
答え3
セクションを読むことをお勧めします8.4.6 forkとexecveを使用してプログラムを実行する
存在する http://www.groupes.polymtl.ca/inf2610/documentation/ComputerSystemBook.pdf