CodeBlanks Logo Icon CodeBlanks

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

main.c
#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

main.c
#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ı

Soru
fcntl(STDIN_FILENO, F_SETFL, ____);
Cevap
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.

İleri seviye bölümündeki tüm dersler