1

X サーバーの準備ができているかどうかを判断するために使用する単純なアプリケーションがあります。アプリケーションは init プロセスで使用され、すべての X アプリケーションが完了するために依存します。接続を試み続け、接続が確立されると、単純に終了します。

int main(int argc, const char *argv[])
{
    Display *dis;

    while(1){
        dis = XOpenDisplay(NULL);

        if(dis != 0)
            break;
        usleep(1000);
    }

    if(dis != 0)
       XCloseDisplay(dis);

    return 0;
}

私の問題は、Nvidia ドライバーをアップグレードした後、この簡単なテストの後に X アプリケーションを実行しても、画面に何も表示できなかったことです。

また、最初のアプリケーションとして xeyes を実行すると、動作します。次に、Ctrl-c (実行中の xeyes アプリケーションを終了するため) を押して新しいアプリケーションを開始すると、画面には何も表示されませんが、エラーは画面に表示されません。

これは予想される動作ですか?最後の X アプリケーションが終了した後、Xorg は動作を停止することになっていますか?

4

2 に答える 2

2

X には「サーバー世代」の概念があります。最後のクライアントが X サーバーから切断されるたびに、サーバーは自分自身をリセットしようとし、新しい「世代」を開始したと言います。ほとんどのユーザーは最初の世代を通過することはないため、複数の世代はあまりテストされていないため、複数の世代を使用しているときにバグが発生しても大きな驚きではありません. 新しい世代がトリガーされると、メモリ リークが発生することがよくあります。X サーバーが新しいサーバー世代になったときに発生するバグを見つけた場合は、bugs.freedesktop.org に報告してください。

環境の説明から、新しいサーバー世代をトリガーしているようです。「-noreset」を指定して X を起動すると、サーバーがリセットされるのを回避できます。これにより、既存のバグが隠される可能性があります (これは良いテストです!)。

余談ですが、貼り付けたプログラムを SIGUSR1 を使用するスキームに置き換えることを検討してください。次のテキストは「man Xserver」からのものです。

  SIGUSR1 This  signal  is  used  quite  differently from either of the above.
          When the server starts, it checks to see if it has inherited
          SIGUSR1 as SIG_IGN instead of the usual SIG_DFL.  In this case, the server
          sends a SIGUSR1 to its parent process after it has  set
          up the various connection schemes.  Xdm uses this feature to recognize
          when connecting to the server is possible.
于 2011-12-02T16:35:38.493 に答える
0

これは明らかに予期しない動作です。

しかし、あなたがこの「ポーリング」プログラムを使用しているという事実は、あなたが他のバグを回避しようとしていることを示しています。

高速起動マシン、Ubuntu+Nvidia+plymouth には既知の問題があります。システムをアップグレードするか、プリマスを無効にできるかどうかを確認してください。

また、vty「動作を停止」したときに X が実行されているものを確認できますか?

ps -ef | grep X
gdmtty="$(ps --no-heading -o tty -p $(pgrep X))"
stty -F "/dev/$gdmtty"
ps -f -t "$gdmtty"

(場合によっては、SIGNALS に関する端末フラグが XServer に不適切であり、Ctrl-C が問題を引き起こす可能性があります)。

于 2011-12-01T11:17:42.133 に答える