2009-09-11 8 views
5

Ich möchte viele wichtige Presseereignisse simulieren. Ich habe eine Lösung gefunden mit XTestFakeKeyEvent, aber wenn ich mehr als 210 mal simuliere, löst mein Programm einen "Maximale Anzahl von Clients erreicht" Segmentationsfehler. Ich weiß nicht, wie ich dieses Problem lösen soll.Hilfe: Maximale Anzahl von Clients erreicht - Segmentierungsfehler

Mein Code hier:

#include <X11/Xlib.h> 
#include <X11/keysym.h> 
#include <X11/extensions/XTest.h> 
#include <stdio.h> 

#define PRESS_UP 0 
#define PRESS_DOWN 1 
#define PRESS_LEFT 2 
#define PRESS_RIGHT 3 
#define PRESS_ENTER 4 
#define PRESS_ESC 5 
#define PRESS_HOME 6 

Display *display; 
unsigned int keycode; 

int press(int key){ 
    display = XOpenDisplay(NULL); 

    if(key == PRESS_UP) 
     keycode = XKeysymToKeycode(display, XK_Up); 
    else if(key == PRESS_DOWN) 
     keycode = XKeysymToKeycode(display, XK_Down); 
    else if(key == PRESS_LEFT) 
     keycode = XKeysymToKeycode(display, XK_Left); 
    else if(key == PRESS_RIGHT) 
     keycode = XKeysymToKeycode(display, XK_Right); 
    else if(key == PRESS_ENTER) 
     keycode = XKeysymToKeycode(display, XK_Return); 
    else if(key == PRESS_ESC) 
     keycode = XKeysymToKeycode(display, XK_Escape); 
    else if(key == PRESS_HOME) 
     keycode = XKeysymToKeycode(display, XK_Home); 

    XTestFakeKeyEvent(display, keycode, True, 0); 
    XTestFakeKeyEvent(display, keycode, False, 0); 
    XFlush(display); 
    return 0; 
} 

int main(int argc, char *argv[]){ 
    int count = 0; 
    while (count < 500){ 
     press(PRESS_UP); 
     printf("count =%d\n" ,count); 
     count ++; 
    } 
} 

Ausgang:

$ gcc -lXtst -lX11 Util_KeyPressSimulator.c 
$ ./a.out 
count =0 
^[[Acount =1 
^[[Acount =2 
... 
^[[Acount =208 
^[[Acount =209 
^[[Acount =210 
^[[AMaximum number of clients reachedSegmentation fault 

Muss man bitte helfen, danke.

Antwort

12

Sie machen eine XOpenDisplay pro Iteration ohne eine übereinstimmende XCloseDisplay. Betrachten Sie das Öffnen des Displays einmal in main() außerhalb der Schleife und schließen Sie es vor dem Beenden.

+2

Auch keine Überprüfung auf fehlgeschlagen 'XOpenDisplay', wenn es fehlschlägt, dann stürzt dieser Client ab. – mark4o