Pertanyaan Mengapa pilih digunakan di Linux


Saya sedang menjalani program serial dan saya mengamati bahwa mereka menggunakannya select() sebelum menggunakan read(). Mengapa sebenarnya ini diperlukan. Mengapa kita tidak bisa langsung menelepon read() dan periksa apakah gagal atau tidak? Juga mengapa kita harus menaikkan deskriptor file dengan 1 dan melewatkannya ketika saya melewati file descriptor sudah ditetapkan select()?

Contoh:

r=select(fd+1, &fds, NULL, NULL, &timeout);  dimana fds sudah memiliki nilai fd


32
2018-01-27 05:09


asal


Jawaban:


Itu select() system call memberi tahu Anda apakah ada data untuk dibaca pada deskriptor file yang Anda minati. Sebenarnya, ini adalah pertanyaan apakah operasi baca pada deskriptor file akan memblokir atau tidak.

Jika Anda mengeksekusi read() pada deskriptor file - seperti yang terhubung ke port serial - dan tidak ada data untuk dibaca, maka panggilan akan hang sampai ada beberapa data untuk dibaca. Program menggunakan select() tidak ingin diblokir seperti itu.

Anda juga bertanya:

Mengapa kita harus menaikkan deskriptor file dengan 1 dan melewatkannya ketika saya melewati file deskriptor yang sudah ditetapkan select?

Itu mungkin menentukan ukuran FD_SET tapi mungkin melakukannya dengan buruk. Argumen pertama untuk select() diketahui sebagai nfds dan POSIX mengatakan:

Itu nfds Argumen menentukan rentang deskriptor yang akan diuji. Pertama nfds pendeskripsi harus diperiksa di setiap set; yaitu deskriptor dari nol sampai nfds-1 dalam set keterangan harus diperiksa.

Jadi, untuk menguji deskriptor file n, nilai dalam nfds setidaknya harus n+1.


37
2018-01-27 05:13



Program yang ingin terus berjalan sementara juga membaca input pengguna interaktif1 harus multithread atau mereka perlu membaca aliran masukan dengan hati-hati dan, secara khusus, secara kondisional.

Select(2) dapat digunakan untuk mengimplementasikan pola desain kedua. Ini dapat menentukan apakah input dapat dibaca tanpa memblokir seluruh aplikasi.


1. Atau beberapa masukan lain yang tiba tak terduga.


5
2018-01-27 05:28



Anda menggunakan panggilan pilih ketika Anda harus terus-menerus memantau deskriptor file sampai mereka siap untuk beberapa IO tanpa pemblokiran.

Umumnya digunakan ketika Anda ingin IO (misalnya baca ()) non-blocking, baca:halaman manual

Baca juga API terkait


3
2018-01-27 05:13