我是Linux和C开发的新手,试图用X11库在C中进行屏幕截图。如果我正常编译和运行我的程序,屏幕截图是正确的,没有问题。如果我将程序作为服务运行,如
sudo systemctl start screenshot
程序失败。日志和使用GDB分析coredump都只显示
Program terminated with signal SIGSEGV, Segmentation fault.
我已经在我的代码中设置了手动日志:
int main(int argc, char** argv ){
FILE *fp = fopen("log.txt", "w");
setvbuf(fp, NULL, _IONBF, 1024);
fputs("2", fp);
Display* display = XOpenDisplay(NULL);
fputs("5", fp);
Window root = DefaultRootWindow(display);
fputs("6", fp);
作为服务运行时,log.txt包含序列25。如果从。/screen这样的终端运行,程序将正常终止。
如能提供任何提示以查找问题的原因,我将不胜感激。
David指出检查display是否为NULL,一些搜索显示问题是程序在作为服务运行时无法打开display
基于这个问题:https://unix.stackexchange.com/questions/537628/error-cannot-open-display-on-systemd-service-which-needs-graphical-interface
将systemd服务文件中的Environment设置为
Environment=DISPLAY=:0.0
Environment=XAUTHORITY=/home/<username>/.Xauthority
解决了问题,服务正常运行。