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 应用程序)并启动一个新应用程序,屏幕上不会显示任何内容,但屏幕上不会出现任何错误。

这是预期的行为吗?Xorg 是否应该在最后一个 X 应用程序退出后停止工作?

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存在已知问题;看看您是否可以升级您的系统或禁用普利茅斯?

另外,你能检查一下vtyX 在“停止工作”时正在运行什么吗?

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 回答