私のデスクトップにはさまざまなプログラム用の複数の実行プログラムがあり、これらの実行プログラムには「ターミナルで実行」設定があります。
その設定を確認すると、プログラムが端末で実行され、そこに出力が書き込まれます。stdin
ターミナルでも読めると思います。
しかし、プログラムが端末で実行されていない場合、IOはどうなりますか?また、このようなプログラムでシステム(シェル)コマンドを実行するとどうなりますか?
これらのプログラムを実行する「バックグラウンド」シェルはありますか?それとも、各プログラムにシステムの残りの部分と対話する独自のシェルはありますか?
答え1
プログラムが起動したら(一連のシステムコールの1つをexec(3)
介して)環境(つまりシェル変数ed)を継承し、親からファイルを開きます。export
プログラムの起動時に実行する作業は、fork(2)
サブルーチンが環境とファイルを設定してからexec(3)
新しいプログラムを作成することです。シェルがこれを行うと、STDIN、STDOUT、およびSTDERRが端末に接続されます。グラフィックランチャーの役割はグラフィックランチャーによって異なりますが、何に接続する必要があります/dev/null
(キーボード入力はどこから来、出力はどこに行くべきですか?)
上記のように起動したプログラムが順次呼び出されると、上記とexec(3)
同じです。コマンドラインの解析などを行うためにシェルを作成し、そのシェルがコマンドを実行するsystem(3)
ため、少し複雑です。exec(3)
しかし、メカニズムは同じです。つまり、ファイルが継承され、環境も継承されます。