Как программа может получить дескриптор очереди сообщений в структуре siginfo_t, возвращенной sigwaitinfo () - PullRequest
0 голосов
/ 20 февраля 2019

Я программирую на Linux в c.В siginfo_t для дескриптора файла есть si_fd.Я получаю сигнал от другого процесса, и sigwaitinfo возвращает информацию об этом сигнале.Я хочу получить дескриптор файла, но не повезло. Структура siginfo_t выглядит так:

siginfo_t {
               int      si_signo;     /* Signal number */
               int      si_errno;     /* An errno value */
               int      si_code;      /* Signal code */
               int      si_trapno;    /* Trap number that caused
                                         hardware-generated signal
                                         (unused on most architectures) */
               pid_t    si_pid;       /* Sending process ID */
               uid_t    si_uid;       /* Real user ID of sending process */
               int      si_status;    /* Exit value or signal */
               clock_t  si_utime;     /* User time consumed */
               clock_t  si_stime;     /* System time consumed */
               sigval_t si_value;     /* Signal value */
               int      si_int;       /* POSIX.1b signal */
               void    *si_ptr;       /* POSIX.1b signal */
               int      si_overrun;   /* Timer overrun count;
                                         POSIX.1b timers */
               int      si_timerid;   /* Timer ID; POSIX.1b timers */
               void    *si_addr;      /* Memory location which caused fault */
               long     si_band;      /* Band event (was int in
                                         glibc 2.3.2 and earlier) */
               int      si_fd;        /* File descriptor */
               short    si_addr_lsb;  /* Least significant bit of address
                                         (since Linux 2.6.32) */
               void    *si_lower;     /* Lower bound when address violation
                                         occurred (since Linux 3.19) */
               void    *si_upper;     /* Upper bound when address violation
                                         occurred (since Linux 3.19) */
               int      si_pkey;      /* Protection key on PTE that caused
                                         fault (since Linux 4.6) */
               void    *si_call_addr; /* Address of system call instruction
                                         (since Linux 3.5) */
               int      si_syscall;   /* Number of attempted system call
                                         (since Linux 3.5) */
               unsigned int si_arch;  /* Architecture of attempted system call
                                         (since Linux 3.5) */
           }

Любая помощь, спасибо

1 Ответ

0 голосов
/ 20 февраля 2019

Со страницы руководства sigaction (2) , где описана структура siginfo_t:

Сигналы, отправленные для уведомления очереди сообщений (см. Описание SIGEV_SIGNAL в mq_notify(3)) заполните si_int / si_ptr, указав sigev_value для mq_notify (3);si_pid, с идентификатором процесса отправителя сообщения;и si_uid с реальным идентификатором пользователя отправителя сообщения.

Ничего о si_fd там нет.

Кажется, что он заполняется только SIGIO:

SIGIO / SIGPOLL (в Linux эти два имени являются синонимами) заполняет si_band и si_fd.Событие si_band представляет собой битовую маску, содержащую те же значения, которые заполняются в поле wavents функцией poll (2).Поле si_fd указывает дескриптор файла, для которого произошло событие ввода-вывода;подробности см. в описании F_SETSIG в fcntl (2).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...