c - 为什么克隆线程创建的子线程在父线程输出或休眠后不会向终端输出任何内容?
问题描述
我正在学习使用该clone
方法(仅 CLONE_VM)在 ubuntu18 上使用 c 创建子线程。当父线程没有sleep
方法 或时,父线程printf
退出后子线程可以正常运行。不幸的是,当父线程有sleep
or时,子线程将在父线程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秒后,子线程的输出也出现了。在第二行的输出之后,我可以直接输入命令。我不知道它应该如何工作。谁能帮我?
解决方案
推荐阅读
- css - 截断宽度 = 100% 的文本
- jq - 如何将函数应用于jq中的多个字段
- reactjs - 按 Escape 关闭 Material UI 工具提示
- python - 将 DataFrame 作为新列附加
- javascript - Reactjs 如何从 Azure 存储容器下载文件
- excel - 基于矩阵隐藏/取消隐藏Excel工作表
- node.js - 我正在尝试为 node.js 创建一个登录页面,但在访问数据库中保存的数据时遇到问题
- php - Laravel websocket 与 vue.js 实时聊天
- java - Jenkins 权限被拒绝 /usr/share/maven 无法构建测试
- python - Mac用brew安装python3.6