Как использовать указатель на функцию с kthread_run? - PullRequest
2 голосов
/ 26 июня 2019

Я пишу системный вызов в 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 Ответ

2 голосов
/ 26 июня 2019

При взгляде на источник 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) с самого начала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...