ウィンドウを閉じた後、Xクライアントアプリケーションプロセスを終了する必要がありますか?

ウィンドウを閉じた後、Xクライアントアプリケーションプロセスを終了する必要がありますか?

Xクライアントアプリケーションのウィンドウが閉じると、アプリケーションプロセスは終了しますか(成功または失敗に関係なく終了試行のみ可能ですか)。

サポート手順が終了した場合、終了手順をどのように通知できますか?特定の信号に基づいて、基本的な作業はプロセスを終了することです。もしそうなら、信号を送るのは何ですか?

ありがとうございます。

答え1

長すぎる博士。X11プロトコルには、プロセス、シグナル、またはあらゆる種類のIPCの概念はありません。サーバーとクライアントは、プロセスの概念がまったくない可能性がある他のシステムおよびオペレーティングシステムに存在する可能性があります。 Lispマシンは依然として重要でした。)X11プロトコル自体は、Unixソケット、tcp / ipを介して実行することも、SSHなどを介してトンネリングすることもできます。

X11ウィンドウを「閉じる」方法は3つあります。

  1. ClientMessage原子を含むイベントをWM_DELETE_WINDOWこのウィンドウに送信します。ウィンドウを作成したアプリケーションは、これを行うことができます(ウィンドウを直接終了し、他のアプリケーションはウィンドウを閉じて実行を続けることができます)、ウィンドウを無視することができますxclock。これは通常、ボタンを押すか、いくつかの「標準」キーの組み合わせ(例えば。xeyesXAlt-F4

  2. 強制的に窓を破壊してくださいXDestroyWindow。アプリケーションはこれを予期しない可能性があり、DestroyNotifyイベントを無視してまだ存在するかのようにウィンドウで操作を実行しようとする可能性があり、これによりXlibのデフォルトのエラーハンドラ(を使用してXErrorEvent設定)が印刷されます。BadWindowこの場合は、エラーメッセージを表示してクリーンアップしてくださいXSetErrorHandlerexit(3)

  3. このウィンドウを呼び出すXKillClientと、ウィンドウを作成したクライアントは強制的に閉じられます(ウィンドウの代わりにXIDpixmapなどのX11リソースを使用できます)。 [1] です。これはxkill(1)、または何の関係もなく、どのプロセスにもシグナルを送信しません。クライアントが特別な措置を講じない限り(参考資料を参照)、クライアントが生成するすべてのリソース(ウィンドウ、ピックスマップ、グラフィックスコンテキスト)は削除されます。同様に、デフォルトのXlibkill(2)kill(1)XSetCloseDownMode(3)イオこの場合、エラーハンドラ(に設定XSetIOErrorHandler)はエラーメッセージを印刷してクリーンアップします。exit(3)ptとの違い2.XSetIOErrorHandler缶を含むハンドラのセットです。いいえ返品。

一部のアプリケーションは、2.と3.を「衝突」として非常に迷惑に処理します(たとえば、Firefoxはfalseに設定しない限り、実行時に悪名高い「これはあまりにも恥ずかしい」というメッセージを表示しますbrowser.sessionstore.resume_from_crash)。

また、アプリケーションは、サーバーから追い出されたのXKillClientか、サーバー自体が予期せず終了したかクラッシュしたのかを知ることはできません。

繰り返す価値があるもう1つの事実は、X11プロトコルです協力的な設計上、X11 クライアント間に障壁と検査はありません。すべてのクライアントは他のクライアントを追い出すことができ、XKillClientウィンドウを破壊したりサイズ変更したり、キーボードまたはマウスの両方を使用したり、ウィンドウマネージャを使用するようにオーバーライドリダイレクトフラグを設定したりできます。 。

[1] 使用しない限り育児xkill -framewm、仕事に使用する必要があります。

答え2

まず、Xクライアントは複数のウィンドウを開くことができます。 Xクライアントの「対応」ウィンドウは存在しません。

(クライアント) Xlib機能xdestroyウィンドウXサーバーに特定のウィンドウを削除するようにウィンドウマネージャ(WM)が呼び出すこともできます。その後、Xサーバーは内部データ構造からウィンドウを削除し、DestroyNotifyクライアントにイベントを送信します。クライアントは、現在使用されているウィンドウのカウンタを減らすなど、このイベントを処理できます。

デフォルトでは、すべてのX Toolkitライブラリは一種のメインイベントループとそのメインループを終了する方法を提供します。たとえば、Xtツールキットにはがあり、XtAppMainLoopマニュアルページには次のようになります。

XtAppNextアプリケーションは、いくつかのグローバルシャットダウンフラグをテストするか、イベント呼び出しで再ループする前に、最上位ウィジェットの数が0より大きいかどうかをテストするループの独自のバージョンを提供できます。

したがって、アプリケーションを終了するには正しくプログラムする必要があります。ウィンドウなしで実行し続けることを妨げることはありません。実際、一部のXコマンドラインツールはWindows Xクライアントアプリケーションでは使用されません。

説明されたメカニズムはWMの場合に使用されます。閉じるウィンドウです。一般的な方法は、WMがWM_DELETE_WINDOWクライアントにメッセージを送信し、クライアントが選択した方法でメッセージに応答できることです。たとえば、確認ダイアログボックス(「本当にこのプログラムを終了しますか?」)を表示し、ユーザーが確認したらすべてをクリーンアップして終了できます。これは、ほとんどのXプログラミング例で見られる推奨動作です。ただし、クライアントがこのメッセージを完全に無視するのを防ぐ方法はありません(この場合、WMを使用してxdestroywindowウィンドウを強制的に閉じることができます)。

関連情報