2012-11-22 69 views
0

我的任務是對打印服務器執行精簡的多線程模型。將文件描述符傳遞給線程並在函數中使用(作業)

功能get_server的原型爲:

void *get_request(void *arg); 

「參數arg指向從那裏請求是要讀取一個打開的文件描述符。」所以在測試時建議使用STDIN_FILENO,但是當所有內容完成時描述符都必須是通用的。

pthread_create(&tid, &attr, get_request, STDIN_FILENO); 

函數裏面我試圖使用arg,並且無法將它從void *更改爲任何可用的東西。比如這一切都不工作:

read(*arg, intvariable, sizeof(int)); // can't cast void * error 
int fd = *arg; // can't cast void * error 
int fd = *(int *)arg; // seg fault 
int fd = *((int *)arg); // seg fault 

int fd = atoi(arg); // seg fault 
// yes I'm aware arg isn't a char* but that's 
// from the example code we were given 
+0

主題在作業說明中提到。再次感謝。 –

回答

3

您是在正確的道路:

void *get_request(void *arg) 
{ 
    int fd = (int) arg; 

    ... 
} 

然而,這不是推薦的方法。相反,創建一個變量和該地址傳遞給pthread_create電話:

int fd = STDIN_FILENO; 
pthread_create(&tid, &attr, get_request, &fd); 

然後使用

void *get_request(void *arg) 
{ 
    int fd = *((int *) arg); 

    ... 
} 

不過要小心,所以用於pthread_create呼叫變量的範圍不在線程啓動之前耗盡。然後你會有一個指向未使用內存的指針。將此變量放在main函數的頂部(如果您在main中調用pthread_create)。

+0

非常感謝您的幫助。我很高興看到我走上正軌。我嘗試過的一件事忘了放在我的解釋中,那就是我嘗試了pthread_create(&tid,&attr,get_request,&STDIN_FILENO);和gcc踢了這回:「Print_server.c:21:46:錯誤:左值需要作爲一元'&'操作數」,所以我從來沒有想過將STDIN_FILENO的值保存到另一個變量。 –

0

您的函數期望指針的值爲,但您傳遞的值爲本身!因此,要遵循指針方案,您需要將指針傳遞給包含值STDIN_FILENO的全局變量。

或者,你可以「騙」所傳遞STDIN_FILENO就像你正在做,然後投了void*一個簡單int,並把它作爲是(不是指針!):

int fd = (int) arg; 
+0

謝謝你的解釋。 –

相關問題