#include < unistd.h >
#include < pthread.h >
#include < stdio.h >
void * thr_fn1( void * arg)
{
printf( " thread 1 returning\n " );
return (( void * ) 1 );
}
void * thr_fn2( void * arg)
{
printf( " thread 2 returning\n " );
return (( void * ) 2 );
}
int main( void )
{
int err;
pthread_t tid1,tid2;
void * tret;
err = pthread_create( & tid1,NULL,thr_fn1,NULL);
err = pthread_create( & tid2,NULL,thr_fn2,NULL);
err = pthread_join(tid1, & tret);
printf( " thread 1 exti code %d\n " ,( int )tret);
err = pthread_join(tid2, & tret);
printf( " thread 2 exit code %d\n " ,( int )tret);
return 0 ;
}
#include < unistd.h >
#include < stdio.h >
#include < pthread.h >
#include < signal.h >
#include < stdlib.h >
int quitflag;
sigset_t mask;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t wait = PTHREAD_COND_INITIALIZER;
void * thr_fn( void * arg)
{
int err,signo;
while ( 1 )
{
err = sigwait( & mask, & signo);
switch (signo)
{
case SIGINT:
printf( " \nSIGINT\n " );
break ;
case SIGQUIT:
pthread_mutex_lock( & lock );
quitflag = 1 ;
pthread_mutex_unlock( & lock );
pthread_cond_signal( & wait);
exit( 0 );
default :
printf( " unexpected signal %d\n " ,signo);
exit( 1 );
}
}
}
int main( void )
{
int err;
sigset_t oldmask;
pthread_t tid;
sigemptyset( & mask);
sigaddset( & mask,SIGINT);
sigaddset( & mask,SIGQUIT);
if ((err = pthread_sigmask(SIG_BLOCK, & mask, & oldmask)) != 0 )
{
printf( " SIG_BLOCK error\n " );
return 1 ;
}
err = pthread_create( & tid,NULL,thr_fn, 0 );
pthread_mutex_lock( & lock );
while (quitflag == 0 )
pthread_cond_wait( & wait, & lock );
pthread_mutex_unlock( & lock );
quitflag = 0 ;
if (sigprocmask(SIG_SETMASK, & oldmask,NULL) < 0 )
{
printf( " SIG_SETMASK error\n " );
}
}
#include < unistd.h >
#include < stdio.h >
#include < pthread.h >
void cleanup( void * arg)
{
printf( " cleanup:%s\n " ,( char * )arg);
}
void * thr_fn1( void * arg)
{
printf( " thread 1 start\n " );
pthread_cleanup_push(cleanup,( void * ) " thread 1 first handler " );
pthread_cleanup_push(cleanup,( void * ) " thread 1 second handler " );
printf( " thread 1 push complete\n " );
if (arg)
return (( void * ) 1 );
pthread_cleanup_pop( 0 );
pthread_cleanup_pop( 0 );
return (( void * ) 1 );
}
void * thr_fn2( void * arg)
{
printf( " thread 2 start\n " );
pthread_cleanup_push(cleanup,( void * ) " thread 2 first handler " );
pthread_cleanup_push(cleanup,( void * ) " thread 2 second handler " );
printf( " thread 2 push complete\n " );
if (arg)
pthread_exit(( void * ) 2 );
pthread_cleanup_pop( 0 );
pthread_cleanup_pop( 0 );
pthread_exit(( void * ) 2 );
}
int main( void )
{
int err;
pthread_t tid1,tid2;
void * tret;
err = pthread_create( & tid1,NULL,thr_fn1,( void * ) 1 );
err = pthread_create( & tid2,NULL,thr_fn2,( void * ) 2 );
err = pthread_join(tid1, & tret);
printf( " thread 1 exit code %d\n " ,( int )tret);
err = pthread_join(tid2, & tret);
printf( " thread 2 exit code %d\n " ,( int )tret);
return 0 ;
}
#include < unistd.h >
#include < stdio.h >
#include < stdlib.h >
#include < pthread.h >
pthread_mutex_t lock1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t lock2 = PTHREAD_MUTEX_INITIALIZER;
void prepare( void )
{
printf( " preparing locks...\n " );
pthread_mutex_lock( & lock1);
pthread_mutex_lock( & lock2);
}
void parent( void )
{
printf( " parent unlock locks...\n " );
pthread_mutex_unlock( & lock1);
pthread_mutex_unlock( & lock2);
}
void child( void )
{
printf( " child unlocking locks...\n " );
pthread_mutex_unlock( & lock1);
pthread_mutex_unlock( & lock2);
}
void * thr_fn( void * arg)
{
printf( " thread started...\n " );
pause();
return 0 ;
}
int main( void )
{
int err;
pid_t pid;
pthread_t tid;
err = pthread_atfork(prepare,parent,child);
pthread_create( & tid,NULL,thr_fn, 0 );
sleep( 2 );
printf( " parent about to fork...\n " );
pid = fork();
if (pid == 0 )
printf( " child return form fork\n " );
else
printf( " parent returned from fork\n " );
return 0 ;
}