mirror of
https://github.com/eddyem/eddys_snippets.git
synced 2025-12-06 10:45:12 +03:00
70 lines
1.2 KiB
C
70 lines
1.2 KiB
C
#include <stdio.h>
|
|
#include <signal.h>
|
|
#include <unistd.h>
|
|
#include <stdlib.h>
|
|
#include <pthread.h>
|
|
#include <errno.h>
|
|
|
|
int child_killed = 0;
|
|
pthread_t athread;
|
|
|
|
void sighndlr(int sig){
|
|
printf("got signal %d\n", sig);
|
|
if(sig == SIGCHLD){
|
|
printf("Child was killed\n");
|
|
child_killed = 1;
|
|
}else if(sig == SIGSEGV){
|
|
printf("suicide\n");
|
|
pthread_exit(NULL);
|
|
}else
|
|
exit(sig);
|
|
}
|
|
|
|
void dummy(){
|
|
int i;
|
|
char *ptr = malloc(10000);
|
|
for(i = 0; i < 256; ++i, ptr += 1024){
|
|
*ptr += i;
|
|
}
|
|
}
|
|
|
|
pid_t create_child(){
|
|
child_killed = 0;
|
|
pid_t p = fork();
|
|
if(p == 0){
|
|
printf("child\n");
|
|
dummy();
|
|
}
|
|
return p;
|
|
}
|
|
|
|
void *thrfnctn(void *buf){
|
|
dummy();
|
|
}
|
|
|
|
int main(){
|
|
int i;
|
|
//for(i = 0; i < 255; ++i)
|
|
// signal(i, sighndlr);
|
|
signal(SIGCHLD, sighndlr);
|
|
signal(SIGSEGV, sighndlr);
|
|
for(i = 0; i < 10; ++i){
|
|
pid_t p = create_child();
|
|
if(p){
|
|
printf("child #%d with PID %d\n", i, p);
|
|
while(!child_killed)
|
|
usleep(10000);
|
|
}else return 0;
|
|
}
|
|
for(i = 0; i < 10; ++i){
|
|
if(pthread_create(&athread, NULL, thrfnctn, NULL))
|
|
return -1;
|
|
printf("thread #%d\n", i);
|
|
while(pthread_kill(athread, 0) != ESRCH)
|
|
usleep(1000);
|
|
pthread_join(athread, NULL);
|
|
}
|
|
return 0;
|
|
}
|
|
|