2017-11-13 4 views
-1

Ich würde etwas Hilfe benötigen. Ich mache es stundenlang und kann es nicht zur Arbeit bringen. Im Allgemeinen habe ich eine Funktion, die auf einen Kernel-Treiber zugreift, und ich möchte diese Funktion als Parameter an eine andere Funktion übergeben, die einen Pthread-Code enthält. Ich recherchierte und fand heraus, dass ich einen Funktionszeiger brauche.C-Programm: übergeben Sie die Funktion als Parameter an eine andere Funktion zum Erstellen von Thread

Hier ist die Funktion, die ich als Parameter übergeben möchte.

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

Hier ist die Funktion, die ich passieren in möchten:

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

ich den Funktionszeiger versucht, aber es mir Fehler gibt.

error: expected expression before ‘char’ 

Ich schätze jede Hilfe sehr geschätzt. Danke!

+1

'pthread_create (& t1, NULL , f, NULL); 'wäre korrekt, aber der Prototyp des Funktionszeigers sollte' void * (*) (void *) 'sein. – mch

Antwort

3

(*f)(char) ist ungültige Syntax. Es sieht so aus, als ob Sie versuchen, die Funktion f aufzurufen und char als Parameter zu übergeben, was Sie nicht tun können.

Da Sie eigentlich nicht f Aufruf, übergeben Sie es nur zu pthread_create direkt:

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

Es ist immer noch ein Problem mit diesem, aber. Es wird erwartet, dass der dritte Parameter pthread_create vom Typ void *(*)(void *) ist, d. H. Ein Zeiger auf eine Funktion, die einen void *-Parameter aufweist und einen void * zurückgibt. Ihre Funktion hat den Typ void (*)(char *), daher sind die Parameter nicht kompatibel.

Sie müssen entweder die Unterschrift des kernelTest ändern zu entsprechen, was pthread_create erwartet:

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

Oder Sie brauchen eine Wrapper-Funktion zu erstellen, die pthread_create matches:

static void *kernelTest_wrapper(void *param) 
{ 
    char *send = param; 
    kernelTest(send); 
    return NULL; 
} 
Verwandte Themen