Is there an alternative sleep function in C to milliseconds?

前端 未结 6 467
难免孤独
难免孤独 2020-11-28 19:25

I have some source code that was compiled on Windows. I am converting it to run on Red Hat Linux.

The source code has included the he

6条回答
  •  甜味超标
    2020-11-28 20:01

    Yes - older POSIX standards defined usleep(), so this is available on Linux:

       int usleep(useconds_t usec);
    

    DESCRIPTION

    The usleep() function suspends execution of the calling thread for (at least) usec microseconds. The sleep may be lengthened slightly by any system activity or by the time spent processing the call or by the granularity of system timers.

    usleep() takes microseconds, so you will have to multiply the input by 1000 in order to sleep in milliseconds.


    usleep() has since been deprecated and subsequently removed from POSIX; for new code, nanosleep() is preferred:

       #include 
    
       int nanosleep(const struct timespec *req, struct timespec *rem);
    

    DESCRIPTION

    nanosleep() suspends the execution of the calling thread until either at least the time specified in *req has elapsed, or the delivery of a signal that triggers the invocation of a handler in the calling thread or that terminates the process.

    The structure timespec is used to specify intervals of time with nanosecond precision. It is defined as follows:

           struct timespec {
               time_t tv_sec;        /* seconds */
               long   tv_nsec;       /* nanoseconds */
           };
    

    An example msleep() function implemented using nanosleep(), continuing the sleep if it is interrupted by a signal:

    #include 
    #include     
    
    /* msleep(): Sleep for the requested number of milliseconds. */
    int msleep(long msec)
    {
        struct timespec ts;
        int res;
    
        if (msec < 0)
        {
            errno = EINVAL;
            return -1;
        }
    
        ts.tv_sec = msec / 1000;
        ts.tv_nsec = (msec % 1000) * 1000000;
    
        do {
            res = nanosleep(&ts, &ts);
        } while (res && errno == EINTR);
    
        return res;
    }
    

提交回复
热议问题