Я запускаю pppd, используя popen в своей программе, чтобы немного упростить получение 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
}
}
Использование ЦП не является проблемой, система и другие части программы по-прежнему реагируют и работают, как и ожидалось.
Любые мысли о том, что может быть причиной этого замедления?
NULL
? - person Flexo   schedule 13.08.2012strace -f
и следить за дочерними процессами, чтобы увидеть, есть ли системный вызов, который приводит к зависаниюpppd
. Он зависает при запуске командыpppd
из командной строки? - person jxh   schedule 13.08.2012