Non-blocking input
- C kursu
- İleri seviye
- Ders 45/83
- 5 dk
Non-blocking girdi okumayı öğrenirsin.
Non-blocking input
Non-blocking girdi, read çağrısının veri yokken beklemesini engeller. fcntl(fd, F_SETFL, O_NONBLOCK) ile tanıtıcıyı non-blocking moda alırsın. Bundan sonra read veri yoksa -1 döner ve errno EAGAIN olur.
Bu, oyunlar ve etkileşimli uygulamalar için temel bir desendir. STDIN_FILENO'yu non-blocking yapınca döngü içinde sürekli okuyabilirsin; veri yoksa başka iş yapılır. Test için printf("nonblock: 1\n") yazdırmak yeterlidir; bu deterministiktir. Gerçek uygulamada döngü içinde read çağrılır ve EAGAIN kontrol edilir.
EAGAIN ile başa çıkma
Non-blocking read çağrısı veri yoksa -1 döner. errno değeri EAGAIN (veya EWOULDBLOCK) olur. Bu bir hata değildir; yalnızca verinin o an yok olduğunu bildirir.
Doğru desen: ssize_t n = read(fd, buf, sizeof(buf)); if (n < 0 && errno == EAGAIN) { /* veri yok, devam */ }. Böylece program veri yoksa beklemek yerine başka iş yapar. Test için yalnızca fcntl ve printf çağrılarını yapmak yeterlidir; gerçek read döngüsü ortam bağımlıdır. Çıktı deterministik kalır.
Uygulama Non-blocking kipi ayarla
fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK); ile tanıtıcıyı non-blocking moda al. printf("nonblock: 1\n"); ile durum yazdır.
Başlangıç kodu
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
// tanıtıcıyı non-blocking moda al
// durumu yazdır
int main(void) {
return 0;
}Örnek çözüm
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main(void) {
fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK);
printf("nonblock: 1\n");
return 0;
}Beklenen çıktı
nonblock: 1
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 fcntl çağrısı
fcntl(STDIN_FILENO, F_SETFL, ____);
fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK);
Açıklama: O_NONBLOCK bayrağı tanıtıcıyı beklemez moda alır.
2 Non-blocking kavramlarını eşle
| Kavram | Anlamı |
|---|---|
fcntl |
Bayrak kurar |
O_NONBLOCK |
Beklemez kip |
EAGAIN |
Veri yok |
F_SETFL |
Bayrak komutu |
3 Non-blocking read veri yokken ne döner?
- -1 ve errno EAGAIN Doğru cevap
- Sonsuz bekler
- 0
- EOF
Açıklama: -1 döner ve errno EAGAIN olur; bu hata değildir.