LINUX.ORG.RU

[C] Список PID из WM

 


0

1

Добрый вечер господа. Необходимо получить список PID приложений из pager, то-есть тех - что запущены в пространстве WM,и имеют окна, если так можно выразиться. Направьте на нужные страницы документации, ибо самостоятельное гугление - результатов не дает. Видимо - как-то не так реквестирую запрос у гугла-(



Последнее исправление: CynicRus (всего исправлений: 1)
#include <stdio.h>
#include <stdlib.h>

#include <X11/Xatom.h>
#include <X11/Xutil.h>

int main()
{
    Display *display = XOpenDisplay(NULL);

    if (display == NULL) {
        fprintf(stderr, "system error: XOpenDisplay");
        exit(EXIT_FAILURE);
    }

    Window window = XDefaultRootWindow(display);

    Atom net_wm_pid = XInternAtom(display, "_NET_WM_PID", True);

    if (net_wm_pid == None) {
        fprintf(stderr, "system error: can't find the _NET_WM_PID property");
        XCloseDisplay(display);
        exit(EXIT_FAILURE);
    }

    void traverse(void)
    {
        unsigned n, i;
        Window root, parent, *childs;

        Atom type;
        int format;
        unsigned long n_items, n_bytes;
        unsigned char *prop = NULL;

        if (Success == XGetWindowProperty
            (display, window, net_wm_pid, 0, 1, False, XA_CARDINAL, &type,
             &format, &n_items, &n_bytes, &prop)) {
            if (prop != NULL) {
                pid_t pid = *(pid_t*)prop;
                printf("%i\n", pid);
                XFree(prop);
            }
        }

        if (0 != XQueryTree(display, window, &root, &parent, &childs, &n)) {
            for (i = 0; i < n; i++) {
                window = childs[i];
                traverse();
            }
            XFree(childs);
        }
    }

    traverse();

    XCloseDisplay(display);
    exit(EXIT_SUCCESS);
}

/*
 * KLUDGE:
 *
 * ==30192== HEAP SUMMARY:
 * ==30192==     in use at exit: 124 bytes in 1 blocks
 * ==30192==   total heap usage: 1,655 allocs, 1,654 frees, 71,374 bytes allocated
 * ==30192== 
 * ==30192== 124 bytes in 1 blocks are definitely lost in loss record 1 of 1
 * ==30192==    at 0x4026864: malloc (vg_replace_malloc.c:236)
 * ==30192==    by 0x42D0902: ??? (in /usr/lib/i386-linux-gnu/libxcb.so.1.1.0)
 * ==30192==    by 0x42D0A04: ??? (in /usr/lib/i386-linux-gnu/libxcb.so.1.1.0)
 * ==30192==    by 0x42D03D1: xcb_connect_to_display_with_auth_info (in /usr/lib/i386-linux-gnu/libxcb.so.1.1.0)
 * ==30192==    by 0x42D05DB: xcb_connect (in /usr/lib/i386-linux-gnu/libxcb.so.1.1.0)
 * ==30192==    by 0x407FA22: _XConnectXCB (in /usr/lib/i386-linux-gnu/libX11.so.6.3.0)
 * ==30192==    by 0x406F8F3: XOpenDisplay (in /usr/lib/i386-linux-gnu/libX11.so.6.3.0)
 * ==30192==    by 0x80487B6: main (in /tmp/pids)
 * ==30192== 
 * ==30192== LEAK SUMMARY:
 * ==30192==    definitely lost: 124 bytes in 1 blocks
 * ==30192==    indirectly lost: 0 bytes in 0 blocks
 * ==30192==      possibly lost: 0 bytes in 0 blocks
 * ==30192==    still reachable: 0 bytes in 0 blocks
 * ==30192==         suppressed: 0 bytes in 0 blocks
 */
$ gcc -lX11 pids.c -o pids
pids.c: In function ‘main’:
pids.c:27:5: warning: ISO C forbids nested functions
$ ./pids
4212
2015
32547
30756
13614
32547
4847
4219
4478
4480
4847
4219
4363
4363
4363
3772
4051
4082
4212
4218
4219
4220
4363
4212
4418
4418
4418
4220
4220
4478
4480
4524
4524
4480
4860
4212
25801
4212
4212
4219
4219
4847
4478
4212
4478
4212
4478
4478
4212
4212
4212
4478
4220
4478
4219
32547
32547
32547
32547
32547
32547
32547
32547
32547
32547
32547
4478
32547
32547
30756
2015
2015
13614
13614
2015
32547
32547
4847
4847
2015
4847

Но это не все PID - только тех приложений которые выставляют _NET_WM_PID (http://stackoverflow.com/questions/151407/how-to-get-an-x11-window-from-a-pro...).

quasimoto ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.