Docker中运行SDL创建SDL_Renderer时冻结的问题求助
Docker容器中SDL创建渲染器冻结问题
问题概述
在Docker容器内运行SDL程序时,执行SDL_CreateRenderer创建渲染器的环节会出现冻结现象。该问题不仅存在于原生SDL中,基于SDL的Python框架如pygame也会出现类似情况。但同一容器内可以正常运行xeyes和简单tkinter应用,说明容器与主机X11显示的通信是正常的。
测试代码
C语言SDL测试程序(本地主机可正常运行)
#include <SDL2/SDL.h> #include <stdio.h> int a = 0; int main() { // Initialize SDL if (SDL_Init(SDL_INIT_VIDEO) != 0) { SDL_Log("Unable to initialize SDL: %s", SDL_GetError()); return 1; } printf("SDL initialized\n"); // Create a window SDL_Window *window = SDL_CreateWindow("Pixel Drawing", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, 0); if (!window) { SDL_Log("Unable to create window: %s", SDL_GetError()); SDL_Quit(); return 1; } printf("Window created\n"); // Create a renderer SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); if (!renderer) { SDL_Log("Unable to create renderer: %s", SDL_GetError()); SDL_DestroyWindow(window); SDL_Quit(); return 1; } printf("Renderer created\n"); // Draw a rectangle (larger shape) instead of a single pixel SDL_Rect rect = {100, 100, 10, 10}; // x, y, width, height SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); // Set color to red SDL_RenderFillRect(renderer, &rect); // Fill the rectangle with the specified color printf("Rectangle drawn\n"); // Present renderer SDL_RenderPresent(renderer); // Wait for the user to close the window SDL_Event event; while (1) { if (SDL_PollEvent(&event) && event.type == SDL_QUIT) { break; } } // Cleanup SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); return 0; }
使用的Dockerfile
# Dockerfile for sdl2 development FROM debian # Install normal dependencies RUN set -eux; \ apt-get update \ && apt-get install -y --no-install-recommends \ ca-certificates \ curl \ git \ wget \ zsh \ vim \ dbus-x11 \ gdb \ x11-apps \ x11-utils \ x11-xserver-utils \ procps \ && apt-get purge -y --auto-remove \ && apt-get autoclean \ && rm -rf /var/lib/apt/lists/* \ && sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)" # Install SDL2 dependencies RUN set -eux; \ apt-get update \ && apt-get install -y --no-install-recommends \ build-essential \ libsdl2-dev # Generating a universally unique ID for the Container RUN dbus-uuidgen > /etc/machine-id # Update the package list RUN apt-get update -y && apt-get upgrade -y WORKDIR /workspace # Execute /workspace/app/test CMD ["./app/test"]
系统调用追踪与验证
strace追踪结果
通过strace追踪发现,程序持续重复执行以下操作:
poll([{fd=4, events=POLLIN}], 1, -1) = 1 ([{fd=4, revents=POLLIN}]) recvmsg(4, {msg_name=NULL, msg_namelen=0, msg_iov=[{iov_base="#\203\234\0\n\0\0\0\21\0\2\0\335\263(\0\0\0\0\0\17\0\2\0\0\0\0\0\0\0\0\0"..., iov_len=4096}], msg_iovlen=1, msg_controllen=0, msg_flags=0}, 0) = 72
文件描述符验证
通过ls -l /proc/PID/fd/4查看文件描述符4,结果为:
socket:[294329]
再通过ss -aen | grep 294329确认该socket连接的是X11服务器:
u_str ESTAB 0 213248 /tmp/.X11-unix/X0 294330 * 294329 <-> ino:3145895 dev:0/49 u_str ESTAB 19848 0 * 294329 * 294330 <->
疑问
综上,程序在尝试与X11服务器通信但未收到响应,导致冻结。为何SDL程序在Docker中出现此问题,而其他X11应用可正常运行?
内容的提问来源于stack exchange,提问作者Initdd
相关产品推荐
相关产品推荐

