2017-11-13 10 views
-1

私はいくつかの助けが必要です。私は数時間それをやって、それを働かせることができません。一般に、私はカーネルドライバにアクセスする関数を持っており、その関数をいくつかのpthreadコードを含む別の関数へのパラメータとして渡したいと思います。私は研究し、関数ポインタが必要かもしれないことを知りました。Cプログラム:スレッドを作成する別の関数へのパラメータとして関数を渡す

ここでは、パラメータとして渡したい機能があります。ここで

static void kernelTest(char Send[BUFFER_LENGTH]) 
{ 
    int fd = open("/dev/kernelTest", O_RDWR); 
} 

は私が渡したい機能です:

static void createKThread(void (*f)(char *)) 
{ 
    pthread_t t1; 
    int ret; 
    ret = pthread_create(&t1, NULL, (*f)(char), NULL); 
    pthread_join(t1, NULL); 
} 

私は関数ポインタを試みたが、それは私にエラーを与えています。

error: expected expression before ‘char’ 

私は非常にレンダリングされた任意の助けに感謝。ありがとうございました!

+1

'のpthread_create(&T1、NULLあなたは何pthread_createを期待と一致するようにkernelTestの署名を変更するか必要

、f、NULL); '正しいはずですが、関数ポインタのプロトタイプは' void *(*)(void *) 'でなければなりません。 – mch

答えて

3

(*f)(char)は無効な構文です。関数fを呼び出して、charをパラメータとして渡すように見えているようですが、これを行うことはできません。

あなたが実際にfを呼び出していないので、ちょうど直接pthread_createに渡し:

ret = pthread_create(&t1, NULL, f, NULL); 

は、これに伴う問題は、しかし、まだあります。 pthread_createの第3のパラメータは、タイプvoid *(*)(void *)であると予想され、void *パラメータを持ち、void *を返す関数へのポインタです。関数の型がvoid (*)(char *)なので、パラメータは互換性がありません。

static void *kernelTest(void *param) 
{ 
    char *send = param; 
    int fd = open("/dev/kernelTest", O_RDWR); 
    return NULL; 
} 

それとも、pthread_createに一致するラッパー関数を作成する必要があります:

static void *kernelTest_wrapper(void *param) 
{ 
    char *send = param; 
    kernelTest(send); 
    return NULL; 
} 
関連する問題