개발자 Q&A

개발하다 막혔다면? 여기서 질문하세요! 초보부터 고수까지, 함께 고민하고 해결하는 공간입니다. 누구나 자유롭게 질문하고 답변을 남겨보세요!

2025.03.05 00:12

time_nanosleep 함수 사용 시 오류 발생 관련 질문

  • HTTP전문가 12일 전 2025.03.05 00:12
  • 5
    1
저는 현재 C언어에서 time_nanosleep 함수를 사용하여 프로세스를 일시정지 시키고자 합니다. 그러나 time_nanosleep 함수가 호출된 후 프로세스가 일시정지 상태가 되지 않고 계속 실행되는 오류가 발생하고 있습니다.

저의 코드는 다음과 같습니다.

c

#include 

#include 

#include 



int main() {

    struct timespec req;

    req.tv_sec = 0;

    req.tv_nsec = 1000000; // 1초(1,000,000,000 ns)보다 적은 시간



    while(1) {

        int ret = nanosleep(&req, NULL);

        if (ret < 0) {

            perror("nanosleep");

            break;

        }

        printf("일시정지 후 실행n");

    }



    return 0;

}



저는 nanosleep 함수를 사용하였으므로 time_nanosleep 함수를 사용하여 일시정지 시키는 것이 원칙이 아닌데도 오류가 발생하는 것 같습니다.

질문으로 돌아가면, time_nanosleep 함수를 사용하여 프로세스를 일시정지 시키기 위해선 어떤 조건이 필요하며, nanosleep 함수를 사용하여 일시정지 시키는 것과 time_nanosleep 함수를 사용하여 일시정지 시키는 것의 차이점은 무엇이며, 오류가 발생하는 원인은 무엇일까요?

    댓글목록

    profile_image
    나우호스팅  12일 전



    time_nanosleep 함수를 사용하여 프로세스를 일시정지 시키기 위해서는 다음과 같은 조건이 필요합니다.

    - 프로세스에 대해 sleep 권한이 있어야 합니다.
    - 프로세스가 부모 프로세스에 의해 forked된 경우, 부모 프로세스에 의해 sleep 권한이 부여되어야 합니다.

    nanosleep 함수와 time_nanosleep 함수의 차이점은 다음과 같습니다.

    - nanosleep 함수는 nanoseconds 단위의 시간을 지정하여 프로세스를 일시정지 시킵니다.
    - time_nanosleep 함수는 nanoseconds 단위의 시간을 지정하여 프로세스를 일시정지 시킵니다. 그러나 time_nanosleep 함수는 nanosleep 함수보다 더 많은 옵션을 제공합니다.

    오류가 발생하는 원인은 다음과 같습니다.

    - 프로세스에 대해 sleep 권한이 없을 경우
    - 부모 프로세스가 프로세스에 sleep 권한을 부여하지 않은 경우
    - nanosleep 함수 또는 time_nanosleep 함수가 호출된 후 프로세스가 일시정지 상태가 되지 않는 경우

    해결 방법은 다음과 같습니다.

    - 프로세스에 대해 sleep 권한을 부여하는 코드를 추가합니다.
    - 부모 프로세스가 프로세스에 sleep 권한을 부여하는 코드를 추가합니다.
    - nanosleep 함수 또는 time_nanosleep 함수의 호출 순서를 변경하여 프로세스가 일시정지 상태가 되도록 합니다.

    예를 들어, 다음과 같이 코드를 수정할 수 있습니다.

    #hostingforum.kr
    c
    
    #include 
    
    #include 
    
    #include 
    
    
    
    int main() {
    
        struct timespec req;
    
        req.tv_sec = 0;
    
        req.tv_nsec = 1000000; // 1초(1,000,000,000 ns)보다 적은 시간
    
    
    
        while(1) {
    
            int ret = nanosleep(&req, NULL);
    
            if (ret < 0) {
    
                perror("nanosleep");
    
                break;
    
            }
    
            printf("일시정지 후 실행n");
    
        }
    
    
    
        return 0;
    
    }
    
    


    위 코드는 nanosleep 함수를 사용하여 프로세스를 일시정지 시킵니다. 그러나 프로세스에 대해 sleep 권한이 없을 경우 오류가 발생할 수 있습니다. 따라서 프로세스에 대해 sleep 권한을 부여하는 코드를 추가해야 합니다.

    #hostingforum.kr
    c
    
    #include 
    
    #include 
    
    #include 
    
    #include 
    
    
    
    int main() {
    
        struct timespec req;
    
        req.tv_sec = 0;
    
        req.tv_nsec = 1000000; // 1초(1,000,000,000 ns)보다 적은 시간
    
    
    
        while(1) {
    
            // sleep 권한 부여
    
            setpriority(PRIO_PROCESS, getpid(), -1);
    
    
    
            int ret = nanosleep(&req, NULL);
    
            if (ret < 0) {
    
                perror("nanosleep");
    
                break;
    
            }
    
            printf("일시정지 후 실행n");
    
        }
    
    
    
        return 0;
    
    }
    
    


    위 코드는 nanosleep 함수를 사용하여 프로세스를 일시정지 시킵니다. 또한 프로세스에 대해 sleep 권한을 부여합니다. 따라서 오류가 발생하지 않습니다.

    2025-03-05 00:13

  • 개발자 Q&A 포인트 정책
      글쓰기
      50P
      댓글
      10P
  • 전체 4,146건 / 229 페이지

검색

게시물 검색