从 X11 错误处理程序调用 XGetErrorText()
Calling XGetErrorText() from X11 error handler
从 XSetErrorHandler 设置的错误处理程序调用 XGetErrorText 是否安全?
例如
int errorHandler(Display *dpy, XErrorEvent *err)
{
char buf[BUFLEN];
XGetErrorText(dpy, err->error_code, buf, BUFLEN);
printf("%s\n", buf)
return 0;
}
XSetErrorHandler(errorHandler);
我问是因为手册页说你不应该在显示器上调用任何函数(直接或间接)来生成协议请求,但它没有告诉 XGetErrorText 是否调用。
XGetErrorText
不会产生任何服务器流量。它不应该:例如,服务器不知道您的语言环境,并且无法提供本地化的消息。 XLib
可以,而且确实可以进行几次本地 Xrm 数据库查找。
XGetErrorText
的源代码可以查看,例如here。我们可以看到 XGetErrorText
调用了 XGetErrorDatabaseText
,而后一个函数甚至没有使用它的 dpy
参数。
每个 X 扩展都提供自己的错误事件到错误字符串的转换函数。此函数确实接受 dpy
参数,但是,就像 XGetErrorDatabaseText
一样,不应该使用它来生成任何服务器流量。这个错误处理函数默认由 XEXT_GENERATE_ERROR_STRING
宏 here 生成,它只是封装了对 XGetErrorDatabaseText
.
的另一个调用
从 XSetErrorHandler 设置的错误处理程序调用 XGetErrorText 是否安全?
例如
int errorHandler(Display *dpy, XErrorEvent *err)
{
char buf[BUFLEN];
XGetErrorText(dpy, err->error_code, buf, BUFLEN);
printf("%s\n", buf)
return 0;
}
XSetErrorHandler(errorHandler);
我问是因为手册页说你不应该在显示器上调用任何函数(直接或间接)来生成协议请求,但它没有告诉 XGetErrorText 是否调用。
XGetErrorText
不会产生任何服务器流量。它不应该:例如,服务器不知道您的语言环境,并且无法提供本地化的消息。 XLib
可以,而且确实可以进行几次本地 Xrm 数据库查找。
XGetErrorText
的源代码可以查看,例如here。我们可以看到 XGetErrorText
调用了 XGetErrorDatabaseText
,而后一个函数甚至没有使用它的 dpy
参数。
每个 X 扩展都提供自己的错误事件到错误字符串的转换函数。此函数确实接受 dpy
参数,但是,就像 XGetErrorDatabaseText
一样,不应该使用它来生成任何服务器流量。这个错误处理函数默认由 XEXT_GENERATE_ERROR_STRING
宏 here 生成,它只是封装了对 XGetErrorDatabaseText
.