Из справочной страницы signal.h
прототип (ы) для rt_sigprocmask
выглядит следующим образом:
/* Prototype for the glibc wrapper function */
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
/* Prototype for the underlying system call */
int rt_sigprocmask(int how, const kernel_sigset_t *set,
kernel_sigset_t *oldset, size_t sigsetsize);
Поскольку kernel_sigset_t
находится в прототипе для rt_sigprocmask
, я бы предположил, что определение для этого типа будет включено в signal.h
. Но я получаю сообщение об ошибке, что kernel_sigset_t
необъявлено, когда я пытаюсь использовать его в своей программе.
Я написал небольшую простую программу, чтобы продемонстрировать ошибку:
#include <stdio.h>
#include <signal.h>
int main()
{
printf("%d\n", sizeof(kernel_sigset_t));
return 0;
}
Что выдает это сообщение при компиляции:
>gcc -o tmp tmp.c
tmp.c: In function ‘main’:
tmp.c:5:24: error: ‘kernel_sigset_t’ undeclared (first use in this function)
5 | printf("%d\n", sizeof(kernel_sigset_t));
| ^~~~~~~~~~~~~~~
tmp.c:5:24: note: each undeclared identifier is reported only once for each function it appears in
Почему это происходит? Я включаю не ту вещь или что?
РЕДАКТИРОВАТЬ : ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ
Причина, по которой я задаю этот вопрос, заключается в том, что я делаю программу, которая отслеживает две идентичные программы, работающие параллельно, и сравнивает аргументы каждого системного вызова, чтобы убедиться, что они равны.
Для этого мне нужно проверить, чтобы аргументы системного вызова, которые являются указателями, указывали на одни и те же данные в обеих отслеживаемых программах.
Итак, с помощью системного вызова rt_sigprocmask
Я хочу убедиться, что указатели kernel_sigset_t
set
и oldset
оба указывают на одни и те же данные. Я бы сделал это, сравнив длину данных sizeof(kernel_sigset_t)
по адресам, указанным этими указателями, и выяснил, совпадают ли они (используя process_vm_readv
).
Однако, как и kernel_sigset_t
, это казалось бы, не определено, я не знаю, как это сделать. Как говорится на странице руководства, ядро sigset_t
и пользовательское пространство имеют разные размеры: как мне узнать, какой правильный размер сравнивать? Если я просто использую sigset_t
, будет ли правильно, если ядро будет другим?