使用 clone() 和 printf 的段错误
segfault with clone() and printf
我正在尝试如何在 Linux 3.10.0-327.3.1.el7.x86_64
中为线程实现 clone()
我 运行 这段代码偶尔会出现段错误。我知道如果我使用 CLONE_THREAD
则无法检查线程是否完成,但为什么 printf
会导致问题? Pthread
库如何处理这个问题?没有 printf
s 就没有段错误。
#define STACK_SIZE (1ULL<<22) //4MB
int tmp = 10;
int threadfunc(void *ptr)
{
printf("i'm here\n");
tmp++;
return 0;
}
int main()
{
char *child_stack = malloc(STACK_SIZE);
int child_pid = clone(&threadfunc, child_stack+(STACK_SIZE)-1, CLONE_THREAD|CLONE_SIGHAND|CLONE_VM|CLONE_FS|CLONE_FILES|SIGCHLD, NULL);
printf("my pid: %d\n", getpid());
printf("child pid: %d\n", child_pid);
printf("tmp is: %d\n", val);
return 0;
}
printf
函数不理解它在 clone
中被调用
任务;它是围绕 glibc pthread 库设计的。
您所做的类似于用异步信号中断 printf
,然后从信号重新进入 printf
。
库如何处理这个问题是它使用 clone
作为更复杂的线程实现的一部分,"dresses up" 具有线程标识的克隆任务。此线程标识允许 printf
锁定流操作周围的互斥量。
什么是线程标识?意思是C库中一个线程相关的函数可以通过某种方式查询"what thread is calling me?"得到一个ID,这个ID映射到一个线程描述符结构。 clone
函数本身不会设置此身份。
我正在尝试如何在 Linux 3.10.0-327.3.1.el7.x86_64
中为线程实现clone()
我 运行 这段代码偶尔会出现段错误。我知道如果我使用 CLONE_THREAD
则无法检查线程是否完成,但为什么 printf
会导致问题? Pthread
库如何处理这个问题?没有 printf
s 就没有段错误。
#define STACK_SIZE (1ULL<<22) //4MB
int tmp = 10;
int threadfunc(void *ptr)
{
printf("i'm here\n");
tmp++;
return 0;
}
int main()
{
char *child_stack = malloc(STACK_SIZE);
int child_pid = clone(&threadfunc, child_stack+(STACK_SIZE)-1, CLONE_THREAD|CLONE_SIGHAND|CLONE_VM|CLONE_FS|CLONE_FILES|SIGCHLD, NULL);
printf("my pid: %d\n", getpid());
printf("child pid: %d\n", child_pid);
printf("tmp is: %d\n", val);
return 0;
}
printf
函数不理解它在 clone
中被调用
任务;它是围绕 glibc pthread 库设计的。
您所做的类似于用异步信号中断 printf
,然后从信号重新进入 printf
。
库如何处理这个问题是它使用 clone
作为更复杂的线程实现的一部分,"dresses up" 具有线程标识的克隆任务。此线程标识允许 printf
锁定流操作周围的互斥量。
什么是线程标识?意思是C库中一个线程相关的函数可以通过某种方式查询"what thread is calling me?"得到一个ID,这个ID映射到一个线程描述符结构。 clone
函数本身不会设置此身份。