POSIX Threads/Przykładowe programy/Program 13

Z Wikibooks, biblioteki wolnych podręczników.
/*
 *	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;
}
//------------------------------------------------------------------------