C декларация из стандартной библиотеки сигналов - PullRequest
7 голосов
/ 02 декабря 2010

Так может кто-нибудь объяснить, что это должно делать:

void (*signal(int sig, void (*func)(int)) ) (int);

Это определение взято из стандартной библиотеки сигналов.

Ответы [ 4 ]

7 голосов
/ 02 декабря 2010

Начните с названия:

signal

Идите как можно дальше:

signal(int sig, void (*func)(int))

У вас есть список параметров в скобках, так что это функция, принимающая 2 параметра: int с именем sig и указатель функции с именем func (вы можете проанализировать его таким же образом позже).

Затем вы нажимаете другую правую пару, поэтому вы идете налево:

*signal(int sig, void (*func)(int))

Итак, функция signal возвращает указатель на ... что-то. Давайте уберем скобки и снова перейдем прямо, так как мы можем:

(*signal(int sig, void (*func)(int)) ) (int)

У нас снова есть список аргументов в скобках, поэтому signal возвращает указатель на функцию, которая принимает int в качестве единственного аргумента. Затем снова идите налево:

void (*signal(int sig, void (*func)(int)) ) (int)

Таким образом, функция signal возвращает указатель на функцию, принимая int и возвращая void.

Да, этот язык странный, но, по крайней мере, он последовательный. :)

5 голосов
/ 02 декабря 2010

Функция signal принимает в качестве аргументов:

int sig - a signal value
void (*func)(int) - a pointer to a function that takes an int and returns void

и возвращает:

void (*)(int) - a function that takes an int and returns void

signal регистрирует функцию, вызываемую при возникновении сигнала, и возвращает предыдущийобработчик функций.

1 голос
/ 02 декабря 2010

В основном это позволяет решить, как обрабатывать определенный сигнал (идентифицируемый аргументом int sig), отправленный в вашу программу.

void (*func)(int) - указатель на функцию, которая будет обрабатывать сигнал (выможет предоставить пользовательский или использовать SIG_DFL SIG_IGN, которые являются действиями по умолчанию для нормального управления им или игнорировать его.

Функция signal затем возвращает указатель на текущий обработчик ДО вызова этогофункция или SIG_ERR произошла ошибка.Это может быть использовано для восстановления обработчика по умолчанию в последнее время, когда вы закончили с пользовательским поведением.

0 голосов
/ 02 декабря 2010

Страница man облегчает понимание этой декларации, вводя typedef как:

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

sighandler_t определяется как указатель на функцию, которая принимает int и возвращает void.

signal - это функция, которая принимает int (номер сигнала) и указатель на функцию и возвращает указатель на функцию.

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