Возвращаемое значение sigsetjmp
- это значение, данное [возможному] siglongjmp
2-му аргументу.
По соглашению, это ненулевое значение (если siglongjmp
передано 0, оно будет используйте 1).
Значение, возвращаемое sigsetjmp
, показывает, как вызывающая сторона различает "нормальную" операцию по отношению к событию / сигналу.
Первый раз, когда возвращается 0. Вызывающая сторона теперь будет выполнять "нормальные" операции.
Когда вызывается siglongjmp
, стек сбрасывается до точки вызова sigsetjmp
. Но возвращаемое значение будет отличным от нуля, сообщая вызывающей стороне, что событие сработало, и вызывающая сторона должна выполнить «прерывание» обработки.
Обсуждаемое ненулевое значение [снова] происходит из 2-го аргумента siglongjmp
. Это может быть любое ненулевое значение. Таким образом, мы можем использовать его как код типа «abort». (например) Это может быть номер сигнала, который произошел, если мы будем sh.
или любым значением: (например) enum { ABORT_NOFILE = 100, ABORT_NOMEM, ABORT_BECAUSE_ITS_TUESDAY };
, с которым согласны два вызывающих / вызывающих абонента.
Во всяком случае, вот код для иллюстрации:
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <setjmp.h>
sigjmp_buf jmpbuf;
int termval = 23;
void
handler(int sig)
{
siglongjmp(jmpbuf,termval);
}
int
main(void)
{
#if 0
int retval;
#else
volatile static int retval;
#endif
signal(SIGALRM,handler);
retval = sigsetjmp(jmpbuf,1);
if (! retval) {
alarm(5);
printf("running normally ...\n");
// do something useful ...
while (1);
}
else {
printf("signal occurred -- retval=%d\n",retval);
}
return 0;
}