2012-08-12 18 views
1

我在我的程序中使用popen啓動了pppd,使得獲取IP地址和接口名稱更容易一點。我的代碼獨立運行,是一個非常典型的實現。當它在完整的程序中運行時(問題太大而無法發佈),該問題開始了......該循環似乎在fgets()行中停留了相當長的一段時間。 popen在自己的線程中啓動,然後根據輸出進行管理。pppd popen掛在C中

popen/pppd代碼基本上是以下內容。

int main(void){ 
    pthread_create(&thread, NULL, pppd, (char *)NULL); 
    pthread_join(thread, NULL); 

    return 0; 
} 

void *pppd(char *args){ 
    char* command = malloc(32); 

    sprintf(command, "pppd %s call %s", dev, provider); 
    pppd_stream = popen(command, "r"); 

    if(pppd_stream == NULL){ 
     pppd_terminated = TRUE; 
     return; 
    } 

    free(command); 

    while(fgets(buffer, 128, d->pppd_stream) != NULL){ 

     //handle_output 
    } 

} 

CPU使用率不是問題,系統和程序的其他部分仍然響應並按預期運行。

有什麼想法可能會導致這種放緩?

+0

你檢查返回值是不是'NULL'? – Flexo 2012-08-12 20:42:18

+0

是的,對不起,這在完整版本中存在。現在我會更準確地實施更新。 – DarkRyuu 2012-08-12 20:52:55

+0

你的流程有多大,你有多少內存?此外,您可以使用'strace -f'並關注子進程,看看是否有系統調用會導致'pppd'掛起。當你從命令行運行'pppd'命令時它會掛起嗎? – jxh 2012-08-12 20:58:12

回答

0

確保您的命令空終止字符串

#define COMMAND_BUFFER_SIZE 256 /* Modify this if you need */ 

snprintf(command, COMMAND_BUFFER_SIZE, "pppd %s call %s", dev, provider); 
command[COMMAND_BUFFER_SIZE - 1] = '\0'; 
pppd_stream = popen(command, "r"); 

編輯:

檢查fgets

while(fgets(buffer, 128, d->pppd_stream) != NULL){ 

您可能希望這樣:

while(fgets(buffer, 128, pppd_stream) != NULL){ 
+0

謝謝,在我的程序中,我實際上memset陣列'\ 0'之前,我使用它應該有同樣的效果,我應該停止修剪我的代碼這麼多上傳 – DarkRyuu 2012-08-12 21:27:27

+1

'snprintf'始終爲空終止,除非size參數爲零,在這種情況下,它什麼都不寫。 – 2012-08-13 00:33:45