> For the complete documentation index, see [llms.txt](https://dimitar-minchev.gitbook.io/linux-system-programming/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://dimitar-minchev.gitbook.io/linux-system-programming/05_ipc/06_signal_wait.md).

# Изчакване на сигнали

```c
#include<signal.h>
int sigwait(const sifset_t *set, int *sig);
```

Функцията **sigwait()** спира изпълнението на извикващата нишка, изчаквайки един от сигналите да стане текущ.\
Функцията приема сигнала (премахва го от чакащия списък със сигнали) и връща номера на сигнала в **sig**.\
При успех **sigwait()** връща 0, при грешка връща положително число, номер на грешката.

## Пример за изчакване на сигнал

Дефинирайте функцията за обработка на сигнали **SIGTERM**. Иницирайте сигнал, като само **SIGHUP** е включен и блокирайте обработката на сигнали.\
Задайте обработчик на събития за **SIGTERM**. Отпечатайте идентификатора на процеса (**pid**). Изчакайте входящ сигнал **SIGHUP** и изведете подходящо съобщение. Ако възникне грешка преустановете програмата.

## signal-wait.c

```c
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>

int main(int argc, char ** argv)
{
   int sig;
   struct sigaction sa;
   sigset_t newset;
   sigemptyset(&newset);
   sigaddset(&newset, SIGINT); // Ctr + C
   sigprocmask(SIG_BLOCK, &newset, 0);
   sigaction(SIGTERM, &sa, 0);

   printf("My pid is %i\n", getpid());
   printf("Waiting...\n");

   while(!sigwait(&newset, &sig))
   {
     printf("SIGINT recieved\n");
     return EXIT_SUCCESS; // 0
   }

   return EXIT_FAILURE; // -1
}
```

Компилирайте и стартирайте програмата:

```
gcc signal-wait.c -o signal-wait
./signal-wait
```
