Является ли `signal ()` функцией системного вызова в Linux? - PullRequest
0 голосов
/ 31 мая 2018

С man-страницы signal() http://man7.org/linux/man-pages/man2/signal.2.html

ИМЯ top

   signal - ANSI C signal handling

Синтез top

   #include <signal.h>

   typedef void (*sighandler_t)(int);

   sighandler_t signal(int signum, sighandler_t handler);

Ситуация в Linux выглядит следующим образом:

   * The kernel's signal() system call provides System V semantics.

   * By default, in glibc 2 and later, the signal() wrapper function
     does not invoke the kernel system call.  Instead, it calls
     sigaction(2) using flags that supply BSD semantics.  This default
     behavior is provided as long as a suitable feature test macro is
     defined: _BSD_SOURCE on glibc 2.19 and earlier or _DEFAULT_SOURCE
     in glibc 2.19 and later.  (By default, these macros are defined;
     see feature_test_macros(7) for details.)  If such a feature test
     macro is not defined, then signal() provides System V semantics.

Мне кажется, что цитата signal() является не системным вызовом, а функцией-оболочкой, реализованной на основе системного вызова sigaction(), за исключением «системного вызова signal () ядра».,

Так что signal() является функцией системного вызова или нет в Linux?

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

В Linux существует системный вызов signal (см. Список системных вызовов Linux, данных Джимом).Вы никогда не перехватываете системный вызов напрямую, вы всегда вызываете функцию обертывания (по крайней мере, вы редко генерируете перехват непосредственно).Как указано в руководстве, signal() - это просто оболочка для системного вызова, которая может не совпадать с signal (пример приведен для truncate в документе, цитируемом @Jim).Функция signal() находится в libc, и эта библиотека может свободно реализовывать эту функцию так, как ей хочется, при условии сохранения семантики.Так как вы упомянули, что вызов signal() может при определенных обстоятельствах перехватить системный вызов signal или системный вызов sigaction или любой другой подходящий.

0 голосов
/ 31 мая 2018

Страница man для системных вызовов указывает, что косвенное обращение к оболочке является распространенным, и содержит список системных вызовов Linux, который включает signal(2):

http://man7.org/linux/man-pages/man2/syscalls.2.html

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