Подскажите, как правильно удалять дочерние потоки из памяти после завершения родительского процесса с помощью сигнала SIGKILL?
Думал сделать примерно так:
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <sched.h>
#include <sys/wait.h>
static time_t current_sec = 0;
static volatile long int counter = 0;
int thread_f( void *a ) {
while( ++counter < 300 ) {
if( (current_sec + 3) < time(0) ) break;
sleep( 1 );
}
printf( "(i) closing thread %d, %s\n", getpid(),
counter < 300 ? "parent died... :(" : "everything is OK!" );
return 0;
}
#define N_THREADS 10
int main( int n, char** a ) {
int i;
pid_t tid[ N_THREADS ];
char tstack[ N_THREADS<<12 ];
current_sec = time(0);
for( i=0; i<N_THREADS; ++i ) {
tid[ i ] = clone( thread_f, tstack + ((i+1)<<12),
CLONE_FILES|CLONE_FS|CLONE_SIGHAND|CLONE_SYSVSEM|CLONE_VM, 0 );
}
while( counter < 300 ) {
current_sec = time(0);
usleep( 500000 );
}
for( i=0; i<N_THREADS; ++i ) waitpid( tid[ i ], 0, 0 );
printf( "(i) closing parent\n" );
return 0;
}
Но есть нюансы. Например малая точность определения отсутствия предка, а также возможен случай когда предка просто усыпили с помощью SIGSTOP.