2013-08-28 3 views
1

저는 difftime을 사용하는 작은 C 프로그램을 가지고 있습니다. 정말 이상한데, 10 초가 지나면 그 라인을 출력하지 않습니다.이 작은 C 프로그램이 예상대로 작동하지 않는 이유는 무엇입니까?

그러나 수면 입력란의 주석 처리를 제거하면 문제가 해결됩니다.

왜 이런 생각입니까?

/* difftime example */ 
#include <stdio.h>  /* printf */ 
#include <time.h>  /* time_t, struct tm, difftime, time, mktime */ 

int main() 
{ 
    time_t start, stop; 

start = time(NULL); 
     for(; /* some condition that takes forever to meet */;) { 
     // do stuff that apparently takes forever. 
       stop = time(NULL); 
       double diff = difftime(stop, start); 
       //sleep (1); 
       if (diff >= 10) { 
         printf("10 seconds passed..."); 
         start = time(NULL); 
       } 
     } 
} 

BTW : 코드가 잘 컴파일되고 Raspberry Pi에서 실행 중입니다. 3.6.11+ # 474 PREEMPT 6 월 13 일 17:14:42 BST 2013 armv6l GNU/Linux

+2

재생할 수 없습니다. 'printf()'에 개행 문자를 추가하면, 코드는'sleep (1)'의 유무에 상관없이 잘 동작합니다. 재현하는 데 필요한 정확한 단계를 설명하십시오. – NPE

답변

8

콘솔 IO는 라인 버퍼링 될 수 있습니다.

printf("10 seconds passed..."); 
fflush(stdout) 

세척하거나 sleep에 대한 호출이 주석 때 내가 행동의 변화를 재현 할 수없는 \n

printf("10 seconds passed...\n"); 

줄 바꿈을 추가하십시오.

+3

하지만 어떻게'sleep (1)'이 바뀔까요? – NPE

+0

고마워 - 개행 \ n이 효과가 있었다. 나는 이것을 몇 시간 동안 고민해왔다. :) – Greg

+0

@NPE 처음에는 '잠'에 대한 언급을 놓쳤다. 왜 그것이 그 일에 영향을 미치고보고 된 결과를 재현 할 수 없는지 설명 할 수는 없습니다. 그에 따라 내 대답을 업데이트했습니다. – simonc

3
printf("10 seconds passed...\n"); 
0

sleep()의 경우 unistd.h를 포함하고 다른 사람들이 지적한대로 줄 바꿈을 추가해야합니다.

#include <stdio.h>  /* printf */ 
#include <time.h>  /* time_t, struct tm, difftime, time, mktime */ 
#include <unistd.h>  /* sleep() */ 

경고없이 컴파일되고 unistd.h를 포함하지 않으면 코드를 경고해야합니다.

관련 문제