2013-07-10 4 views
0

나는 특정 간격으로 내 Wi-Fi 신호의 강도를 반환하는 기능이 있습니다.Popen이 프로그램을 멈추게합니다.

FILE *sig; 
int sigstr=0, max; 
sig = popen("iwconfig wlan0 | awk '/Link/ {print $2}'","r"); 
while(fgetc(sig)!='='); 
fscanf(sig,"%d/%d", &sigstr, &max); 
pclose(sig); 
return(((sigstr*4)+(max/2))/max); 

내가으로 실행하고 문제는 내 프로그램은 간격이 와이파이 신호를 얻기위한 시간에 따라 일정 기간 후에 정지 점이다. 간격이 짧을수록 프로그램이 더 빨리 멈 춥니 다. 지금 내가 틀렸다면 나를 교정해라. 그러나 이것은 기억에 문제가있는 것처럼 보인다. 시간이 경과함에 따라 일부 항목이 스택에서 제대로 제거되지 않거나 할당이 취소되지 않아 메모리가 가득 차고 결국 프로그램을 계속 실행할 수없는 수준에 도달하게됩니다. 그래서 내 질문은 내가 떨어져있는 파일을 무료로 다른 진술을 포함해야합니까 아니면 pclose 돌봐 줘야합니까 떨어져 무엇입니까?

감사합니다.

+0

sig는 포인터 일뿐입니다. 아키텍처에 따라 4 또는 8 바이트의 메모리가 필요합니다. 거의 충분한 공간을 차지하지 않습니다. 내 생각에 fscanf가 돌아오고 오류가 발생했습니다. 반환 값을 잡고 errno를 확인하십시오. – Magn3s1um

+0

서브 프로세스가 어떤 이유로 든 예상 출력을 생성하지 못하면 'while (fgetc (sig)! ='= ');'가 영원히 반복됩니다. – Casey

답변

1

fscanf가 차단 될 수 있기 때문입니다. fcntl을 사용하여 popen에서 얻은 파일 설명자를 비 블로킹으로 설정하십시오.

+0

응답 해 주셔서 감사합니다! 이것이 비 블로킹을 설정하는 적절한 방법입니까? 'fcntl (fileno (sig), F_SETFL, O_NONBLOCK);' "awk : 파일/dev/stdout (파손 된 파이프)에서 오류가 발생했습니다."오류가 발생합니다. – hein13

+0

그래, 그거야. fsync 또는 플러시를 수행하여 닫기 전에 버퍼를 플러시해야합니다. – Magn3s1um

+0

fscanf가 -1을 반환하고 errno를 EAGAIN으로 설정하면 문제가 발생합니다. – hein13