GNU/Linux >> Belajar Linux >  >> Linux

Apakah ada fungsi tidur alternatif dalam C hingga milidetik?

Atau ke usleep() , yang tidak didefinisikan dalam POSIX 2008 (meskipun didefinisikan hingga POSIX 2004, dan ternyata tersedia di Linux dan platform lain dengan riwayat kepatuhan POSIX), standar POSIX 2008 mendefinisikan nanosleep() :

nanosleep - tidur beresolusi tinggi

#include <time.h>
int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);

nanosleep() fungsi akan menyebabkan utas saat ini ditangguhkan dari eksekusi hingga interval waktu yang ditentukan oleh rqtp argumen telah berlalu atau sinyal dikirim ke utas pemanggil, dan tindakannya adalah memanggil fungsi penangkap sinyal atau menghentikan proses. Waktu penangguhan mungkin lebih lama dari yang diminta karena nilai argumen dibulatkan ke atas menjadi kelipatan bilangan bulat dari resolusi tidur atau karena penjadwalan aktivitas lain oleh sistem. Namun, kecuali untuk kasus diinterupsi oleh sinyal, waktu penangguhan tidak boleh kurang dari waktu yang ditentukan oleh rqtp , yang diukur dengan jam sistem CLOCK_REALTIME.

Penggunaan nanosleep() fungsi tidak berpengaruh pada tindakan atau pemblokiran sinyal apa pun.


Ya - standar POSIX lama mendefinisikan usleep() , jadi ini tersedia di Linux:

int usleep(useconds_t usec);

DESKRIPSI

Fungsi usleep() menangguhkan eksekusi thread panggilan untuk (setidaknya) mikrodetik usec. Tidur dapat diperpanjang sedikit oleh aktivitas sistem apa pun atau oleh waktu yang dihabiskan untuk memproses panggilan atau oleh perincian pengatur waktu sistem.

usleep() membutuhkan waktu mikrodetik , jadi Anda harus mengalikan masukan dengan 1000 untuk tidur dalam milidetik.

usleep() sejak itu tidak digunakan lagi dan kemudian dihapus dari POSIX; untuk kode baru, nanosleep() lebih disukai:

#include <time.h>

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

DESKRIPSI

nanosleep() menangguhkan eksekusi utas panggilan hingga setidaknya waktu yang ditentukan dalam *req telah berlalu, atau pengiriman sinyal yang memicu pemanggilan penangan di utas pemanggilan atau yang menghentikan proses.

Spesifikasi waktu struktur digunakan untuk menentukan interval waktu dengan presisi nanodetik. Ini didefinisikan sebagai berikut:

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

Contoh msleep() fungsi diimplementasikan menggunakan nanosleep() , melanjutkan tidur jika terganggu oleh sinyal:

#include <time.h>
#include <errno.h>    

/* 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;
}

Anda dapat menggunakan fungsi lintas platform ini:

#ifdef WIN32
#include <windows.h>
#elif _POSIX_C_SOURCE >= 199309L
#include <time.h>   // for nanosleep
#else
#include <unistd.h> // for usleep
#endif

void sleep_ms(int milliseconds){ // cross-platform sleep function
#ifdef WIN32
    Sleep(milliseconds);
#elif _POSIX_C_SOURCE >= 199309L
    struct timespec ts;
    ts.tv_sec = milliseconds / 1000;
    ts.tv_nsec = (milliseconds % 1000) * 1000000;
    nanosleep(&ts, NULL);
#else
    if (milliseconds >= 1000)
      sleep(milliseconds / 1000);
    usleep((milliseconds % 1000) * 1000);
#endif
}

Linux
  1. Apakah Grub Solusi Bootloading Terbaik? Apakah Ada Alternatif yang Lebih Mudah?

  2. Bisakah Grep Mengembalikan Benar/Salah Atau Apakah Ada Metode Alternatif?

  3. Tanggal Dalam Milidetik Di Openwrt Di Arduino Yun?

  1. Apakah ada cara untuk menemukan waktu berjalan dari perintah yang terakhir dieksekusi di shell?

  2. Tidur selama milidetik

  3. Cara mencetak waktu saat ini (dengan milidetik) menggunakan C++ / C++11

  1. Perintah Tidur Linux – tunda selama waktu tertentu

  2. Mengapa Ada Penundaan Besar Setelah Memasukkan Kata Sandi yang Salah?

  3. Atur waktu waktu eksekusi beberapa perintah