GNU/Linux >> Belajar Linux >  >> Linux

Nonblocking Dapatkan Karakter

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.)


Linux
  1. File Setara ".bashrc" Dibaca Oleh Semua Shell?

  2. `^m` Dan Bagaimana Cara Menghilangkannya?

  3. Kotak Sibuk Membaca File Baris demi Baris?

  1. Bagaimana Cara Membaca Variabel Dari File?

  2. Baca File Ke Array?

  3. Izin File di Linux – Baca/Tulis/Jalankan

  1. Bagaimana cara mendapatkan path lengkap dari suatu file?

  2. Mengapa pilih digunakan di Linux

  3. Dapatkan Panjang MP3 di Linux / FreeBSD