Флаг CLONE_SIGHAND приводит к сбою clone () - PullRequest
1 голос
/ 18 апреля 2020
#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: enter image description here

без флага SIGHAND:

enter image description here

...