2017-12-15 17 views
0

저는 학교 프로젝트를하고 있습니다. (C로 개발해야합니다.) 프로그램 실행 후 X 초와 Y 초마다 코드를 실행해야합니다. 시작해야 끝납니다.sleep() C가 올바른 값을 반환하지 않습니다.

그래서 내가 쓴 :

alarm(Y); 
s=X; 
while(!end){ 
    s = sleep(s); //because it generates some children that send signal to him and in that case i need to do other stuffs 
    if(s == 0){ 
     //code to do each X seconds 
    } 
} 

변수 end 내가 X> Y 코드를 가지고있는 경우 전역 변수가 0으로 초기화하고 SIGALARM가 수신 될 때 값이 1

이되는 것입니다 각 X 초가 실행되지 않아야하지만 X = Y + 1이면 한 번 실행됩니다.

왜 이런 일이 발생했는지 말씀해 주시겠습니까?

+0

나는 명확하지가 않다. 영어 문제는 잘 알고 있지만 그래픽 작업이 가능한가? –

+3

[alarm (2) 및 sleep() 호출이 _ 착오가 바람직하지 않습니다 ._] (https://linux.die.net/man/3/sleep) –

+0

수면 매뉴얼조차 경보 및 수면을 혼합한다고하면 나쁜 생각, 그렇게 생각하지 않아야합니다. – joemartin94

답변

2

Per the manual :

설명

sleep() 신호 인 도착할 때까지 하나 개수까지 초 단위로 지정 실시간 초 은 경과했거나 잠 호출 스레드 원인 무시하지 마라. 통화가 신호 처리기에 의해 중단 된 경우

반환 값

요청 시간이 경과 한 경우 제로 또는 초 수는 잠 떠났다.

alarm()의 사용은 거의 확실히 sleep() 전화를 중단합니다.

그리고 경우에도 alarm()을 방해하지 않았다

, sleep()항상 어쨌든 신호에 의해 중단하고 적절하게 그것을 처리해야 할 수 있습니다.

0

에만 sleep()을 쉽게 수행 할 수 있습니다 :

#include <stdio.h> 
#include <unistd.h> 

int main(void) { 
    unsigned int const y = 5; 
    unsigned int const x = 2; 

    { 
    unsigned int left = y; 
    unsigned int action = 0; 
    while (left > 0) { 
     unsigned int time = x - action < left ? x - action : left; 
     printf("I will sleep for %u\n", time); 
     { 
     unsigned ret = sleep(time); 

     action += time - ret; 
     if (action >= x) { 
      printf("do something\n"); 
      action -= x; 
     } 

     left -= time - ret; 
     } 
    } 
    } 
} 

그러나 clock_gettime()nanosleep() 또는 clock_nanosleep() 같은 POSIX 표준과 더 나은 방법 sleep()이있다, 그것은 분명히 정확 아니다 있습니다.