#define _GNU_SOURCE
#include <sched.h>
#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <errno.h>
#define STACK_SIZE 1024*64
int foo(void* args){
// int arg = (int)args;
printf("this is thread\n");
fflush(stdout);
sleep(1);
return 0;
}
void main(){
pid_t pid;
void* stack;
stack = malloc(STACK_SIZE);
if(stack == 0) {
perror("malloc: cound not allocate stack\n");
exit(1);
}
printf("start\n");
if ( (pid = clone(foo, (char*)stack+STACK_SIZE, SIGCHLD | CLONE_FS | CLONE_FILES | CLONE_VM | CLONE_SIGHAND , NULL)) < 0 ) {
fprintf(stderr, "error with %d\n", errno);
}
waitpid(pid, NULL, 0);
printf("end aa\n");
}
Это мой тестовый код для тестирования clone()
с флагами SIGCHLD | CLONE_FS | CLONE_FILES | CLONE_VM | CLONE_SIGHAND
, который необходим для моего университетского задания, использующего clone()
для потоков в пользовательском режиме.
В любом случае, это CLONE_SIGHAND
флаг делает пид -1. Если я его удаляю, то foo()
работает отлично.
Почему CLONE_SIGHAND
ломает его?
+++ добавлено ++ с флагом SIGHAND:
без флага SIGHAND: