/* * 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);}returnNULL;}//------------------------------------------------------------------------#define N 3 /* liczba wątków */pthread_tid[N];voidinicjalizacja_watkow(){inti;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");}}//------------------------------------------------------------------------intmain(){pid_tpid;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;case0:// proces potomnysleep(2);break;default:// proces nadrzędnywaitpid(pid,NULL,0);test_errno("waitpid");break;}/* kończymy proces, bez oglądania się na wątki */returnEXIT_SUCCESS;}