POSIX Threads/Przykładowe programy/Program 13
Wygląd
/*
* Przykładowy program dla kursu "POSIX Threads" z wikibooks.pl
*
* Temat: wysyłanie sygnałow UNIX-owych do wątków
*
* Autor: Wojciech Muła
* Ostatnia zmiana: 2010-03-xx
*/
#define _POSIX_C_SOURCE 200809L
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <pthread.h>
#include <signal.h>
#include <unistd.h> // sleep
#define test_errno(msg) do{if (errno) {perror(msg); exit(EXIT_FAILURE);}} while(0)
pthread_t main_id; // id głównego wątek
// funkcja wątku
void* watek(void* nieuzywany) {
puts("\twątek się rozpoczął");
sleep(1);
puts("\twątek wysyła sygnał SIGUSR1 do głównego wątku");
errno = pthread_kill(main_id, SIGUSR1);
test_errno("pthread_kill");
return NULL;
}
//------------------------------------------------------------------------
int main() {
pthread_t id;
int signum;
sigset_t mask;
// blokowanie SIGUSR1
sigemptyset(&mask);
sigaddset(&mask, SIGUSR1);
errno = pthread_sigmask(SIG_BLOCK, &mask, NULL);
test_errno("pthread_kill");
// odczyt id głównego wątku
main_id = pthread_self();
// utworzenie wątku
errno = pthread_create(&id, NULL, watek, NULL);
test_errno("pthread_create");
// oczekiwanie na sygnał
puts("wątek główny oczekuje na sygnał");
sigwait(&mask, &signum);
test_errno("sigwait");
if (signum == SIGUSR1)
puts("wątek główny otrzymał sygnał SIGUSR1");
else
printf("wątek główny otrzymał sygnał %d\n", signum);
return EXIT_SUCCESS;
}
//------------------------------------------------------------------------