Saya memiliki beberapa kode sumber yang dikompilasi di Windows. Saya mengonversinya untuk dijalankan di Red Hat Linux.
Kode sumber telah menyertakan <windows.h>
file header dan pemrogram telah menggunakan Sleep()
fungsi untuk menunggu selama milidetik. Ini tidak akan berfungsi di Linux.
Namun, saya bisa menggunakan sleep(seconds)
fungsi, tetapi menggunakan integer dalam hitungan detik. Saya tidak ingin mengonversi milidetik ke detik. Apakah ada fungsi tidur alternatif yang dapat saya gunakan dengan kompilasi gcc di Linux?
sleep(/*seconds*/)
dalam<unistd.h>
karya, tetapi jika saya gunakan denganprintf("some things")
tanpa\n
, itu tidak berfungsi.fflush(stdout);
setelah masingprintf()
Jawaban:
Ya - standar POSIX yang lebih lama ditentukan
usleep()
, jadi ini tersedia di Linux:usleep()
membutuhkan mikrodetik , jadi Anda harus mengalikan input dengan 1000 agar dapat tidur dalam milidetik.usleep()
sejak itu telah ditinggalkan dan kemudian dihapus dari POSIX; untuk kode baru,nanosleep()
lebih disukai:Contoh
msleep()
fungsi yang diterapkan menggunakannanosleep()
, melanjutkan tidur jika terganggu oleh sinyal:sumber
Anda dapat menggunakan fungsi lintas platform ini:
sumber
_POSIX_C_SOURCE >= 199309L
, seperti dalam kasus-ansi
atau-std=c89
, saya akan merekomendasikan menggunakanstruct timeval tv; tv.tv_sec = milliseconds / 1000; tv.tv_usec = milliseconds % 1000 * 1000; select(0, NULL, NULL, NULL, &tv);
bukanusleep(milliseconds * 1000);
. Kredit di sini .nanosleep()
dokumentasinya: man7.org/linux/man-pages/man2/nanosleep.2.html . Memposting tautan dokumentasi untuk setiap fungsi platform spesifik yang digunakan di sini akan bermanfaat.gcc -Wall -g3 -std=c11 -o sleep_test sleep_test.c && ./sleep_test
di Linux Ubuntu, dengan gcc versi 4.8.4, saya mendapatkan peringatan berikut:warning: implicit declaration of function ‘usleep’ [-Wimplicit-function-declaration]
. Solusinya adalah dengan menambahkan 2 definisi berikut ke bagian paling atas kode Anda: 1)#define __USE_POSIX199309
dan 2)#define _POSIX_C_SOURCE 199309L
. Keduanya diharuskan mendapatkan kode untuk dikompilasi tanpa peringatan (dan juga menggunakannanoseconds()
fungsi, yang telah tersedia).Sebagai alternatif untuk
usleep()
, yang tidak didefinisikan dalam POSIX 2008 (meskipun itu didefinisikan hingga POSIX 2004, dan itu jelas tersedia di Linux dan platform lain dengan sejarah kepatuhan POSIX), standar POSIX 2008 mendefinisikannanosleep()
:sumber
Di luar usleep , rendah hati pilih dengan file yang NULL deskripsi set akan membiarkan Anda berhenti dengan mikrodetik presisi, dan tanpa resiko
SIGALRM
komplikasi.sigtimedwait dan sigwaitinfo menawarkan perilaku serupa.
sumber
sumber
sumber