首页 > 解决方案 > 为什么克隆线程创建的子线程在父线程输出或休眠后不会向终端输出任何内容?

问题描述

我正在学习使用该clone方法(仅 CLONE_VM)在 ubuntu18 上使用 c 创建子线程。当父线程没有sleep方法 或时,父线程printf退出后子线程可以正常运行。不幸的是,当父线程有sleepor时,子线程将在父线程printf退出时被杀死。我不知道它应该如何工作。

这是我的代码:

int child_proc(void *args)
{
    int a = *((int *)args);
    //sleep(1);
    printf("child receive a arg: %d\n", a);
    exit(1);
}

int main(void)
{
    int cpid, arg = 45, clone_flags = CLONE_VM;
    char *stack = malloc(MAXSPACE); //space
    printf("arg -> %d\n", arg);
    cpid = clone((void *)child_proc, &(stack[MAXSPACE-1]), clone_flags, (void *)(&arg));
    sleep(2); 
    printf("cpid %d\n", cpid);
    return 0;
}

结果如下:

$ ./clone.o
arg -> 45
child receive a arg: 45
cpid 4685

结果看起来不错,当我更改睡眠方法时:

int child_proc(void *args)
{
    int a = *((int *)args);
    sleep(1);
    printf("child receive a arg: %d\n", a);
    exit(1);
}

int main(void)
{
    int cpid, arg = 45, clone_flags = CLONE_VM;
    char *stack = malloc(MAXSPACE);
    printf("arg -> %d\n", arg);
    cpid = clone((void *)child_proc, &(stack[MAXSPACE-1]), clone_flags, (void *)(&arg));
    //sleep(2);
    printf("cpid %d\n", cpid);
    return 0;
}

看起来很正常:

$ ./clone.o
arg -> 45
cpid 4845

子线程没有输出,因为父线程已经退出但是当我删除父线程中的所有sleep方法和printf方法时:

int child_proc(void *args)
{
    int a = *((int *)args);
    sleep(1);
    printf("child receive a arg: %d\n", a);
    exit(1);
}

int main(void)
{
    int cpid, arg = 45, clone_flags = CLONE_VM;
    char *stack = malloc(MAXSPACE);
    //printf("arg -> %d\n", arg);
    cpid = clone((void *)child_proc, &(stack[MAXSPACE-1]), clone_flags, (void *)(&arg));
    //sleep(2);
    //printf("cpid %d\n", cpid);
    return 0;
}

这似乎很奇怪:

$./clone.o
$ child receive a arg: 32767

第一行立即退出,第二行出现。1秒后,子线程的输出也出现了。在第二行的输出之后,我可以直接输入命令。我不知道它应该如何工作。谁能帮我?

标签: clinuxmultithreadingubuntu

解决方案


推荐阅读