我在我的程序中使用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使用率不是問題,系統和程序的其他部分仍然響應並按預期運行。
有什麼想法可能會導致這種放緩?
你檢查返回值是不是'NULL'? – Flexo 2012-08-12 20:42:18
是的,對不起,這在完整版本中存在。現在我會更準確地實施更新。 – DarkRyuu 2012-08-12 20:52:55
你的流程有多大,你有多少內存?此外,您可以使用'strace -f'並關注子進程,看看是否有系統調用會導致'pppd'掛起。當你從命令行運行'pppd'命令時它會掛起嗎? – jxh 2012-08-12 20:58:12