我有一个简单的应用程序,用于确定我的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-application退出后,Xorg是否应该停止工作?
答案 0 :(得分: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.
答案 1 :(得分:0)
这显然不是预期的行为。
但是你使用这个'轮询'程序的事实向我表明你正在尝试解决其他错误。
known issues有快速启动机器,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可能会引起问题)。