2017-11-13 8 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을 , f, NULL);'올바른 것이지만 함수 포인터의 프로토 타입은'void * (*) (void *)'이어야합니다. – mch

답변

3

(*f)(char) 구문이 잘못되었습니다. f 함수를 호출하고 수행 할 수없는 매개 변수로 char을 전달하는 것처럼 보입니다.

실제로 f를 호출하지 않는 때문에, 단지 바로 pthread_create에 전달 :

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

여전히 문제있다, 그러나. pthread_create의 세 번째 매개 변수는 void *(*)(void *) 유형, 즉 void * 매개 변수가있는 함수에 대한 포인터이며 void *을 반환합니다. 함수의 유형이 void (*)(char *)이므로 매개 변수가 호환되지 않습니다.

당신은 pthread_create가 기대하는 것과 일치하는 kernelTest의 서명을 변경하거나 필요

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

또는 당신은 pthread_create 일치하는 래퍼 함수 작성해야합니다 : NULL,

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