POSIX Threads/Przykładowe programy/Program 18

/*
 *	Przykładowy program dla kursu "POSIX Threads" z wikibooks.pl
 *
 *	Temat: pthread_atfork
 *
 *	Autor: Wojciech Muła
 *	Ostatnia zmiana: 2010-03-xx
 */
#define _XOPEN_SOURCE	700
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <errno.h>
#include <unistd.h>	// sleep
#include <sys/wait.h>	// waitpid

#define test_errno(msg) do{if (errno) {perror(msg); exit(EXIT_FAILURE);}} while(0)

void* watek(void* numer) {
	printf("\turuchomiono wątek #%d\n", (int)numer);
	while (1) {
		printf("\t\twątek #%d w procesie #%d\n", (int)numer, getpid());
		usleep(700*1000);
	}

	return NULL;
}
//------------------------------------------------------------------------

#define N 3	/* liczba wątków */

pthread_t id[N];

void inicjalizacja_watkow() {
	int i;
	printf("tworzenie %d wątków w procesie %d\n", N, getpid());
	
	/* utworzenie wątków */
	for (i=0; i < N; i++) {
		errno = pthread_create(&id[i], NULL, watek, (void*)(i+1));
		test_errno("pthread_create");
	}
}
//------------------------------------------------------------------------

int main() {
	pid_t pid;

	puts("początek programu");
	inicjalizacja_watkow();

	/* rejestrowanie funkcji wykonywanej w procesie potomnym */
	errno = pthread_atfork(NULL, NULL, inicjalizacja_watkow);
	test_errno("pthread_atfork");

	sleep(1);

	pid = fork();
	printf("fork => %d\n", pid);
	switch (pid) {
		case -1:
			test_errno("fork");
			break;

		case 0: // proces potomny
			sleep(2);
			break;

		default: // proces nadrzędny
			waitpid(pid, NULL, 0);
			test_errno("waitpid");
			break;
	}

	/* kończymy proces, bez oglądania się na wątki */
	return EXIT_SUCCESS;
}