Anda salah melakukan IO, manual POSIX dan semua dokumentasi terkait lainnya secara eksplisit mengatakan jangan pernah mencampur IO dilakukan pada FILE *
s dan deskriptor file. Anda telah melanggar aturan ini secara terang-terangan. Aturan ini diberlakukan karena FILE *
gunakan penyangga an ini berarti bahwa setelah panggilan ke fgets
tidak akan ada yang tersisa untuk read
untuk mendapatkan karena fgets
sudah membaca semua data yang tertunda ke dalam buffer yang disimpan di FILE *
struktur.
Jadi karena tidak ada cara untuk memeriksa apakah metode ISO C IO akan diblokir, kita harus menggunakan deskriptor file saja.
Karena kita tahu bahwa STDIN_FILENO
hanya angka 0, kita bisa menggunakan
fcntl (0, F_SETFL, O_NONBLOCK);
ini akan mengubah semua read
s pada deskriptor file 0 ke mode non-blocking, jika Anda ingin menggunakan deskriptor file yang berbeda sehingga Anda dapat membiarkan 0 saja maka cukup gunakan dup
untuk menggandakannya.
Dengan cara ini, Anda dapat menghindari poll
sepenuhnya dan terapkan ngetc
sebagai
ssize_t
ngetc (char *c)
{
return read (0, c, 1);
}
atau lebih baik lagi, makro
#define ngetc(c) (read (0, (c), 1))
Dengan demikian Anda mendapatkan implementasi sederhana untuk apa yang Anda cari.
Edit: Jika Anda masih khawatir tentang terminal yang menyangga input, Anda selalu dapat mengubah pengaturan terminal, lihat Cara menonaktifkan buffering baris input di xterm dari program? untuk informasi selengkapnya tentang cara melakukannya.
Edit: Alasan seseorang tidak dapat menggunakan fgetc
bukannya read
adalah untuk alasan yang sama dengan menggunakan fgets
tidak akan bekerja. Saat salah satu dari FILE *
Fungsi IO dijalankan, ia membaca semua data dari deskriptor file terkait. Tapi begitu itu terjadi, poll
tidak akan pernah kembali karena menunggu deskriptor file yang selalu kosong, dan hal yang sama akan terjadi dengan read
. Oleh karena itu, saya menyarankan agar Anda mengikuti saran dari dokumentasi dan tidak pernah campur aliran (IO menggunakan fgets
, fgetc
, dll.) dan deskriptor file (IO menggunakan read
, write
, dll.)