プログラムで popen を使用して pppd を起動し、IP アドレスとインターフェース名を簡単に取得できるようにしています。私のコードは独立して正常に動作し、かなり典型的な実装です。問題は、完全なプログラムで実行されたときに始まります (大きすぎて投稿できません)... ループは fgets() 行でかなり長い間ハングしているようです。popen は独自のスレッドで起動され、出力に基づいて管理されます。
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 使用率は問題ではありません。システムとプログラムの他の部分はまだ応答性があり、期待どおりに実行されています。
この速度低下の原因について何か考えはありますか?