一部のプログラムはすぐにシェルに戻るのに、他のプログラムは実行が完了するまで戻らないのはなぜですか?


13

現代のオペレーティングシステムの本から、コマンドが実行されると、シェルは子プロセスを作成し、子が実行を終了するまで待機し、ユーザーからの別のコマンドを待機することを読みました。これは実際に多くのプログラムの場合ですgedit。端末は私が閉じるまでコマンドを受け取りませんgedit。しかし、Atomコードエディターを開くと、シェルはすぐに戻り、エディターが実行されていても次のコマンドを受け入れる準備ができています。ターミナルを閉じてもアトム閉じません。これは、エディターが子プロセスとしてではなく開かれたことを意味しますか?これを可能にする基本的なメカニズムは何ですか?

ランニングps au | grep atomは与える

<username>      8042  0.0  0.0  15944  2264 pts/1    S+   00:55   0:00 grep --color=auto atom

1
アトムエディターを起動した後ps au | grep atom、ターミナルで実行して質問に出力を追加できますか?
キリル-a

@ kirill-a質問を更新しました。
アスウィンPJ

回答:


18

この質問は、2種類のプログラムについて質問しています。

  1. シェルでユーザーと対話するプログラム、および
  2. シェルでユーザーと対話しないプログラム。

最初のケースでは、シェルでユーザーと対話するプログラムは、シェルに制御を返す前に完了するまで実行するように設計されています。特別なことは何も行われません。

2番目のケースはより複雑です。通常、プログラムはフォーク(メモリ内に自分自身のコピーを作成)し、シェルの制御端末との関連付けを削除するように手配し、元のシェルとは独立して実行される別のプログラムを実行します。2番目のプログラムからのメッセージが表示される場合がありますが、通常は他の方法では対話しません。使用方法に応じて、

  • デーモン(サーバ)プロセス、または
  • プログラムは新しいウィンドウで実行される場合があります。グラフィカルエディターが後者を行います。

参考文献:


ターミナルからのフォークとアソシエーション解除に関する部分は、多くの場合、daemonこれらすべてを行うライブラリ関数を呼び出すことによって行われます。
カスペルド

制御端末の取得を回避するために、ダブルフォークが使用されます
-jfs

両方のコメント:関数はPOSIXにはなく、端末を制御することは知っていますが、答えは短く簡潔に保ちました。私は1980年代後半からダブルフォークを使用しています。
トーマスディッキー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.