如何在kthread_run中使用函数指针?

时间:2019-06-26 15:37:43

标签: c linux linux-kernel

我正在Linux中编写系统调用,为此,我想使用kthread_run创建多个线程。但是,当我传递函数指针时,会得到:

error: passing argument 1 of ‘kthread_create_on_node’ from incompatible pointer type

以下是相关代码:

//method to do nothing for 100 milliseconds
int exist()
{
   mdelay(100);
   return 0;
}

//function pointer to exist
int (*exist_ptr)(void) = ∃

//create processes and delta queues 
for (i = PROC_NUM - 1; i >= 0; i--)
{
    char name[6] = {'d', 'e', 'l', 't', 'a', i2};

    delta_entry de = {
        .task = kthread_run(exist_ptr, NULL, name);
        .list = linked_list;
        .delta_time =  PROC_NUM * MILSEC_GAP;
        .position = i2;
    }
    enqueue(&linked_list, &de, i2 - 1);
    i2++;
}

这显然不是全部代码,因为我不想把帖子写得太长。谢谢!

1 个答案:

答案 0 :(得分:2)

从Linux源代码kthread_run来看,是一个调用kthread_create_on_node的宏,它期望int (*threadfn)(void *data)

int exist()接受了未指定数量的参数,因此与该函数签名兼容,但是int (*exists_ptr)(void)不接受任何参数。 (int exist()int exist(void)仅在C ++中是同义词。在C语言中,()表示未指定的提升参数,而(void)则没有参数。)

在现代C语言中通常不建议使用未原型的函数定义。 您应该从一开始就制作exist函数的签名int exists(void *unused)