2009-09-11 14 views
5

Chcę zasymulować wiele kluczowych zdarzeń prasowych. Znalazłem rozwiązanie przy użyciu XTestFakeKeyEvent, ale gdy zasymuluję więcej niż 210 razy mój program zwiększa błąd segmentacji "Maksymalna liczba klientów osiągniętych". Nie wiem, jak rozwiązać ten problem.Help: Osiągnięto maksymalną liczbę klientów - Usterka segmentacji

Mój kod tutaj:

#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 ++; 
    } 
} 

wyjściowa:

$ 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 

Czy ktoś proszę o pomoc, dziękuję.

Odpowiedz

12

Wykonujesz XOpenDisplay na iterację bez dopasowania XCloseDisplay. Rozważ otwarcie wyświetlacza raz, w main(), poza pętlą i zamknij go przed wyjściem.

+2

Również brak sprawdzenia dla nieudanego 'XOpenDisplay', więc jeśli się nie uda, to ten klient ulega awarii. – mark4o

Powiązane problemy