The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
XOpenDisplay(NULL), !*! pavlinux, 13-Май-10, 19:31  [смотреть все]
Ошибка при доступе к экрану.

Утиль, демон, стартует при загрузке до Xorg, в одну из её задач входит
запуск XWindow_вых функций...  

Утиль грузится от root, KDE/Gnome работали как от рута, так и от обычных юзеров.

При запуске в ручную, уже после Xorg - всё нормально.
Отловил, через syslog место где глюкает, вот оно ниже...

---
#include <X11/Xlib.h>
...

Display *dpy;
dpy = XOpenDisplay(NULL)
if ( dpy == NULL )
    syslog(LOG_INFO. "Error XopenDisplay");
...
---

Есть мысля, что при запуске демона, он считывает ENVRONIMENT,
в котором естественно нету переменной DISPLAY...

  • XOpenDisplay(NULL), !*! gpl77, 22:28 , 13-Май-10 (1)
    >Ошибка при доступе к экрану.

    честно говоря, не понял вопроса - изложено несколько :-) сумбурно.
    но тезис о том, что XOpenDisplay с параметром NULL берет display name
    из DISPLAY - правильный.
    не очнь, правда, понятно что будет открываться, поскольку, как вы говорите,
    > xorg стартует позже.

    • XOpenDisplay(NULL), !*! pavlinux, 00:57 , 14-Май-10 (2)
      >>Ошибка при доступе к экрану.
      >
      >честно говоря, не понял вопроса - изложено несколько :-) сумбурно.
      >но тезис о том, что XOpenDisplay с параметром NULL берет display name
      >из DISPLAY - правильный.

      Сейчас попробую руками вписать

      char *DISPLAY =":0.0";
      XOpenDisplay(DISPLAY);

      >не очень, правда, понятно что будет открываться, поскольку, как вы говорите,
      >> xorg стартует позже.

         Обычный демон слежения за юзерами, работает в паре с модулями ядра.
      Есстественно все это хозяйство должно грузится сразу после ядра и раньше
      всех сервисов.
         Одна из фишек этой системы, выдача предупреждений или информации юзерам,
      типа как в венде.
      У венды этим заведует, по-моему eventlog или как-то так...


      • XOpenDisplay(NULL), !*! gpl77, 12:47 , 14-Май-10 (3)

        >Сейчас попробую руками вписать
        >
        >char *DISPLAY =":0.0";
        >XOpenDisplay(DISPLAY);
        >
        >>не очень, правда, понятно что будет открываться, поскольку, как вы говорите,
        >>> xorg стартует позже.
        >

        зачем править код, когда можно сделать это в шелл.
        я не понимаю чего вы хотите добится :-(

        если xorg, или какой либо другой xserver, не стартовал, то функция вернёт NULL
        и вы получите сообщение в лог
        if ( dpy == NULL )
            syslog(LOG_INFO. "Error XopenDisplay");

        • XOpenDisplay(NULL), !*! pavlinux, 12:54 , 14-Май-10 (4)
          >[оверквотинг удален]
          >>>> xorg стартует позже.
          >>
          >зачем править код, когда можно сделать это в шелл.
          >я не понимаю чего вы хотите добится :-(
          >
          >если xorg, или какой либо другой xserver, не стартовал, то функция вернёт
          >NULL
          >и вы получите сообщение в лог

          Вся фишка в том, что в коде есть if-else

               if (dpy != NULL ) {
                  
                   XWorker(dpy); // если работаем с Х-ами

               }  else {

                   FBWorker(); // если во фреймбуферной консоли.
               }

          Демон стартует задолго до Х-ов.  
          Если при запросе к этой функции не соединяется с X-ами, считаем, что работаем в консоли.

          >if ( dpy == NULL )
          >    syslog(LOG_INFO. "Error XopenDisplay");

          Вот пример, запускать, скажем из /etc/init.d/rc5.d/S00test

          void conn2X(void) {

            Display *dpy;
            dpy = XOpenDisplay(NULL); // пытаемся открыть

            if ( dpy == NULL ) {
               syslog(LOG_INFO. "Error XopenDisplay");  // смотрим сислог
               exit 1;
            }
          XCloseDisplay(NULL);  
          }

          int main(void) {

             sleep(180); // курим три минуты
             conn2X(void); // переходим...

          return 0;
          }

          • XOpenDisplay(NULL), !*! gpl77, 15:20 , 14-Май-10 (5)
            >[оверквотинг удален]
            >     if (dpy != NULL ) {
            >
            >         XWorker(dpy); // если
            >работаем с Х-ами
            >
            >     }  else {
            >
            >         FBWorker(); // если
            >во фреймбуферной консоли.
            >     }

            это новая информация :-)
            тогда все выглядит логично.
            В описании XOpenDisplay явно не указано, что она возвращает
            когда мы к ней обращаемся с display_name == NULL и DISPLAY не установлен.
            но думаю вернуть, тоже, должна NULL если соединиться не удалось

            вот вам выдержка их Xlib - C Language interface (там подробней, чем в man-е)

            Display *XOpenDisplay(display_name)
            char *display_name;
            display_name
            Specifies the hardware display name, which determines the display and communications domain to be used. On a POSIX-conformant system, if the display_
            name is NULL, it defaults to the value of the DISPLAY environment variable.
            The encoding and interpretation of the display name are implementation-dependent. Strings in the Host Portable Character Encoding are supported; support for other characters is implementation dependent. On POSIX-conformant systems, the display name or DISPLAY environment variable can be a string in the format:

            protocol/hostname:number.screen_number
            protocol Specifies a protocol family or an alias for a protocol family. Supported protocol
            families are implementation dependent. The protocol entry is optional. If protocol
            is not specified, the / separating protocol and hostname must also not be specified.
            hostname Specifies the name of the host machine on which the display is physically
            attached. You follow the hostname with either a single colon (:) or a double
            colon (::).
            number Specifies the number of the display server on that host machine. You may
            optionally follow this display number with a period (.). A single CPU can have
            more than one display. Multiple displays are usually numbered starting with
            zero.
            screen_number
            Specifies the screen to be used on that server. Multiple screens can be controlled
            by a single X server. The screen_number sets an internal variable that can be
            accessed by using the DefaultScreen macro or the XDefaultScreen function if
            you are using languages other than C (see section 2.2.1).
            For example, the following would specify screen 1 of display 0 on the machine named ‘‘dualheaded’’:
            dual-headed:0.1
            The XOpenDisplay function returns a Display structure that serves as the connection to the X
            server and that contains all the information about that X server. XOpenDisplay connects your
            application to the X server through TCP or DECnet communications protocols, or through some
            local inter-process communication protocol. If the protocol is specified as "tcp", "inet", or
            "inet6", or if no protocol is specified and the hostname is a host machine name and a single colon
            (:) separates the hostname and display number, XOpenDisplay connects using TCP streams. (If
            the protocol is specified as "inet", TCP over IPv4 is used. If the protocol is specified as "inet6",
            TCP over IPv6 is used. Otherwise, the implementation determines which IP version is used.) If
            the hostname and protocol are both not specified, Xlib uses whatever it believes is the fastest
            transport. If the hostname is a host machine name and a double colon (::) separates the hostname
            and display number, XOpenDisplay connects using DECnet. A single X server can support any
            or all of these transport mechanisms simultaneously. A particular Xlib implementation can support
            many more of these transport mechanisms.
            If successful, XOpenDisplay returns a pointer to a Display structure, which is defined in
            <X11/Xlib.h>. If XOpenDisplay does not succeed, it returns NULL. After a successful call to
            XOpenDisplay, all of the screens in the display can be used by the client. The screen number
            specified in the display_name argument is returned by the DefaultScreen macro (or the XDefaultScreen
            function). You can access elements of the Display and Screen structures only by
            using the information macros or functions. For information about using macros and functions to
            obtain information from the Display structure, see section 2.2.1.
            X servers may implement various types of access control mechanisms (see section 9.8).

            • XOpenDisplay(NULL), !*! pavlinux, 15:56 , 14-Май-10 (6)
              >[оверквотинг удален]
              >>         FBWorker(); // если
              >>во фреймбуферной консоли.
              >>     }
              >
              >это новая информация :-)
              >тогда все выглядит логично.
              >В описании XOpenDisplay явно не указано, что она возвращает
              >когда мы к ней обращаемся с display_name == NULL и DISPLAY не
              >установлен.
              >но думаю вернуть, тоже, должна NULL если соединиться не удалось

              Возвращается указ. на структуру *Display либо NULL.

              В общем, дело не в этом. Дело в бэзопастности.

              Если пускать X без -nolisten tcp, и написать XOpenDisplay("127.0.0.1:0.0");, то всё работает.

              Теперь очередной вопрос:  :)

              Как сделать  XOpenDisplay(), c Xorg -nolisten tcp, из демона стартующего до Xorg ???

              • XOpenDisplay(NULL), !*! gpl77, 16:33 , 14-Май-10 (7)
                >В общем, дело не в этом. Дело в бэзопастности.
                >
                >Если пускать X без -nolisten tcp, и написать XOpenDisplay("127.0.0.1:0.0");, то всё работает.
                >
                >
                >Теперь очередной вопрос:  :)
                >
                >Как сделать  XOpenDisplay(), c Xorg -nolisten tcp, из демона стартующего до
                >Xorg ???

                опять я отстал от хода ваших рассуждений :-)
                чтобы соединялось локально - говорим set DISPLAY :0

                вот же:
                XOpenDisplay connects your
                application to the X server through TCP or DECnet communications protocols, or through some
                local inter-process communication protocol. If the protocol is specified as "tcp", "inet", or
                "inet6", or if no protocol is specified and the hostname is a host machine name and a single colon
                (:) separates the hostname and display number, XOpenDisplay connects using TCP streams. (If
                the protocol is specified as "inet", TCP over IPv4 is used. If the protocol is specified as "inet6",
                TCP over IPv6 is used. Otherwise, the implementation determines which IP version is used.) If
                the hostname and protocol are both not specified, Xlib uses whatever it believes is the fastest
                transport.

                или man X

                X servers listen for connections on a variety of  different  communica-
                       tions  channels    (network  byte    streams,  shared memory, etc.).  Since
                       there can be more than one way of contacting a given server, The  host-
                       name  part of the display name is used to determine the type of channel
                       (also called a transport layer) to be used.  X servers  generally  sup-
                       port the following types of connections:

                       local
                           The  hostname  part  of    the  display  name should be the empty
                           string.    For example:  :0, :1, and :0.1.   The  most  efficient
                           local transport will be chosen.

                       TCPIP
                           The  hostname  part  of    the  display name should be the server
                           machine's IP address name.  Full  Internet  names,  abbreviated
                           names,    and  IP  addresses  are  all  allowed.     For  example:
                           x.org:0, expo:0, 198.112.45.11:0, bigmachine:1, and  hydra:0.1.


                • XOpenDisplay(NULL), !*! pavlinux, 16:49 , 14-Май-10 (8)
                  >[оверквотинг удален]
                  >>Теперь очередной вопрос:  :)
                  >>
                  >>Как сделать  XOpenDisplay(), c Xorg -nolisten tcp, из демона стартующего до
                  >>Xorg ???
                  >
                  >опять я отстал от хода ваших рассуждений :-)
                  >чтобы соединялось локально - говорим set DISPLAY :0
                  >
                  >вот же:
                  >XOpenDisplay connects your

                  Блин, ну переключись Ctrl+Alt+F1

                  И пусти команду

                  # xwd -display :0 -root > /screen.dump


                  • XOpenDisplay(NULL), !*! gpl77, 17:05 , 14-Май-10 (9)
                    >
                    >Блин, ну переключись Ctrl+Alt+F1
                    >
                    >И пусти команду
                    >
                    ># xwd -display :0 -root > /screen.dump

                    И?
                    у меня создался ~/screen.dump
                    А у вас что?
                    и сразу
                    что за система? там xlib или xcb? какой xorg?

                    • XOpenDisplay(NULL), !*! pavlinux, 17:15 , 14-Май-10 (10)
                      >[оверквотинг удален]
                      >>
                      >>И пусти команду
                      >>
                      >># xwd -display :0 -root > /screen.dump
                      >
                      >И?
                      >у меня создался ~/screen.dump
                      >А у вас что?
                      >и сразу
                      >что за система? там xlib или xcb? какой xorg?

                      Во блин...

                      А у меня Сannot open display :0.0  :)


                      • XOpenDisplay(NULL), !*! gpl77, 17:55 , 14-Май-10 (11)
                        >
                        >Во блин...
                        >
                        >А у меня Сannot open display :0.0  :)

                        ну ройте либо в сторону authorization, либо какие local transports
                        скомпилены в xlib/xcb и в xorg или что у вас там

                        • XOpenDisplay(NULL), !*! pavlinux, 18:16 , 14-Май-10 (12)
                          >>
                          >>Во блин...
                          >>
                          >>А у меня Сannot open display :0.0  :)
                          >
                          >ну ройте либо в сторону authorization, либо какие local transports
                          >скомпилены в xlib/xcb и в xorg или что у вас там

                          Уже Нарыл :)


                          setenv("XAUTHORITY", "/home/user/.Xauthority", 1);
                          XOpenDisplay("localhost/unix:0");

                          Только как-то через попинск...

                          Как бы узнать от какого юзера запущен активный экран?

                        • XOpenDisplay(NULL), !*! gpl77, 19:55 , 14-Май-10 (13)
                          >
                          >Как бы узнать от какого юзера запущен активный экран?

                          что есть "активный экран"?
                          тот который используется каким-либо window manager-ом?
                          через /proc или ps
                          еще можно запросить у сервера список клиентов или открытых коннекшинов.
                          это сходу не скажу, надо в xlib или в конкретный сервер/экстеншн смотреть.

                        • XOpenDisplay(NULL), !*! pavlinux, 22:14 , 14-Май-10 (14)
                          >>
                          >>Как бы узнать от какого юзера запущен активный экран?
                          >
                          >что есть "активный экран"?

                          $  w | grep ':0' | cut -d' ' -f1

                        • XOpenDisplay(NULL), !*! pavlinux, 02:44 , 21-Май-10 (15)
                          >[оверквотинг удален]
                          >
                          >Уже Нарыл :)
                          > setenv("XAUTHORITY", "/home/user/.Xauthority", 1);
                          > XOpenDisplay("localhost/unix:0");
                          >Только как-то через попинск...
                          >Как бы узнать от какого юзера запущен активный экран?

                          Спасибо мне


                          #include <stdio.h>
                          #include <stdlib.h>
                          #include <string.h> // strcmp
                          #include <utmpx.h>

                          #define XTTY  ":0"

                          int main(void)
                          {
                              struct utmpx *entry;

                              setutxent();

                              while ( (entry = getutxent()) != NULL) {
                                   if ( !strcmp(entry->ut_line, XTTY) )
                                   printf("%s %s\n",entry->ut_line, entry->ut_user);
                              }
                              endutxent();
                          return(EXIT_SUCCESS);
                          }





Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру