【问题标题】:segfault with clone() and printf带有 clone() 和 printf 的段错误
【发布时间】:2016-06-28 04:22:39
【问题描述】:

我正在尝试如何在 Linux 3.10.0-327.3.1.el7.x86_64 中为线程实现clone()

我正在运行这段代码并且偶尔会出现段错误。我知道如果我使用CLONE_THREAD 则无法检查线程是否完成,但为什么printf 会导致问题? Pthread 库如何处理这个问题?没有printfs 就没有段错误。

#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;
}

【问题讨论】:

  • 正确使用clone() 很棘手。 99% 的时间你想要fork()pthread_create()

标签: c linux pthreads system-calls


【解决方案1】:

printf 函数不理解它在 clone 中被调用 任务;它是围绕 glibc pthread 库设计的。

您所做的类似于用异步信号中断printf,然后从信号中重新输入printf

库如何处理这个问题是它使用clone 作为更复杂的线程实现的一部分,它用线程标识“修饰”克隆的任务。此线程标识允许printf 锁定流操作周围的互斥锁。

什么是线程标识?这意味着 C 库中与线程相关的函数可以以某种方式询问“哪个线程在调用我?”获取一个ID,它映射到一个线程描述符结构。单独的 clone 函数不会设置此身份。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多