XMonad の実行プログラムの手順についていくつか質問があります。これらの質問への回答も、X 環境でアプリケーションを実行する「標準的な」方法を説明するものになることを願っています。
XMonad は関数 ' spawn ' を使用して、ターミナル エミュレーターとプログラム ランチャー (gmrun など) を実行します。
この関数は、「/bin/sh cmd」コマンドを構築する「spawnPID」を呼び出します。
質問 1:単に「cmd」ではなく、「/bin/sh -c cmd」を実行する必要があるのはなぜですか?
私の推測: xmonad.hs のコマンドに追加できる引数を解析するため。
さらに遠く。「xfork」関数と呼ばれる構築されたコマンド「spawnPID」を実行するには、次のようにします。
- fork プロセス (setsid syscall によって要求される、プロセスがグループ リーダーになるのを防ぐため);
- デフォルトの SIGPIPE と SIGCHLD を復元します (forkProcess の動作の回避策のように見えます)。
- call 'createSession' (setsid syscall ラッパー);
- 「spawnPID」で構築されたコマンドを実行します。
質問 2 (メイン): XMonad がそれぞれの子プロセスを独自のセッションで実行するのはなぜですか?
私の意見では、セッションは主にユーザー ログイン セッションまたは「ユーザーが独立した」プログラムに関連付けられています。e. デーモン。1 つのログイン セッションで個別のプログラムごとにではありません。
質問 3: shell+createProcess または proc+createProcess ではなく、なぜ forkProcess+executeFile を使用したのですか?
「forkProcess」は一部非推奨のようです (場合によってはマルチプロセッサ システムでは、こちらを参照してください)。ただし、「createProcess」はこの場合正常に動作し、「/bin/sh -c」と入力せずにシェルでの実行をサポートする必要があります。
これは、実行中のプログラムに対処するためのより良い方法かもしれません。しかし、私はその専門家ではなく、ドキュメントを簡単に読むだけです。