如何在没有图形库的情况下与C中的X服务器通信?

use*_*356 2 c linux xserver

如果我想编写一个C程序与Linux上的X服务器通信并产生最简单的可视化结果,例如在显示器上设置一个像素,我该怎么做?

我想尽可能少地使用库,从头开始理解它,无论代码多么低效/混乱.

更新 - 通过"没有库",我的意思是基本上没有任何可用于X的辅助库,也没有图形工具包.

更新 - 答案是"通过unix socket",特别是/tmp/.X11-unix/X0(至少在这台机器上,大概是显示0).实际上绘制一个像素太复杂了,我想在这里得不到答案.

fuz*_*fuz 7

如果您想完全不使用库,则需要执行以下步骤:

  • 了解您所针对的平台的装配
  • 了解如何在不使用目标上的libc的情况下创建二进制文件.这可能涉及编写用于设置初始堆栈帧的程序集
  • 了解如何在不使用目标上的libc的情况下进行系统调用.这可能涉及组装.
  • 学习和理解网络编程以及POSIX套接字API的工作原理
  • 了解如何在不使用目标上的libc的情况下打开网络连接
  • 学习并理解X11协议
  • 实现您需要的X11协议子集
  • 打开与X服务器的网络连接
  • 告诉X服务器创建一个窗口
  • 与X服务器协商颜色空间
  • 告诉X服务器为窗口中的单个像素着色

如果要使用libc和libsocket,则只保留以下步骤(大致):

  • 学习和理解网络编程以及POSIX套接字API的工作原理
  • 学习并理解X11协议
  • 实现您需要的X11协议子集
  • 打开与X服务器的网络连接
  • 告诉X服务器创建一个窗口
  • 与X服务器协商颜色空间
  • 告诉X服务器为窗口中的单个像素着色

  • [我发布了一个答案](/sf/ask/847830301/#50317548) 给出了明确的 C 代码,它*精确地*这个(第二部分,使用 libc 而没有程序集)。不要害怕,这并不像人们相信的那么困难! (3认同)