2012-08-10 8 views
8

Bu, "adam seç" in kod örneğidir ve yazılan gerçek bir dosyayı okumak için birkaç satır vardır. ./myfile.txt yazıldığında, select'un artık o fd'den okuyabileceğine inanıyordum. Ama ne olur txt dosyası mevcut olduğu sürece while döngüsünde sürekli olarak döner seçer. Sadece dosyanın sonuna yeni veriler yazıldığında dönmesini istiyorum. Bunun nasıl olması gerektiğini düşündüm.Normal dosya tanıtıcılarında (yuva dışı)() işareti nasıl seçilebilir?

#include <stdio.h> 
#include <fcntl.h> 
#include <stdlib.h> 
#include <sys/time.h> 
#include <sys/types.h> 
#include <unistd.h> 

int 
main(void) 
{ 
    fd_set rfds; 
    struct timeval tv; 
    int retval; 

    int fd_file = open("/home/myfile.txt", O_RDONLY); 

    /* Watch stdin (fd 0) to see when it has input. */ 
    FD_ZERO(&rfds); 
    FD_SET(0, &rfds); 
    FD_SET(fd_file, &rfds); 

    /* Wait up to five seconds. */ 
    tv.tv_sec = 5; 
    tv.tv_usec = 0; 

    while (1) 
    { 
    retval = select(fd_file+1, &rfds, NULL, NULL, &tv); 
    /* Don't rely on the value of tv now! */ 

    if (retval == -1) 
     perror("select()"); 
    else if (retval) 
     printf("Data is available now.\n"); 
     /* FD_ISSET(0, &rfds) will be true. */ 
    else 
     printf("No data within five seconds.\n"); 
    } 

    exit(EXIT_SUCCESS); 
} 
+0

Sorunuz nedir? ** 'select' sadece soketler üzerinde çalışmalı mı dedi **? – cnicutar

+0

soru düzenlendi. karışıklık için üzgünüm. – glutz

+0

'select', _any_ dosya tipi tanımlayıcısında kullanılabilir, soket, dosya veya boru veya benzeri herhangi bir tanımlayıcı olup olmadığı fark etmez. Bununla birlikte, bir dosya yazıldığında izlemek için kullanamazsınız, bunun için Linux'taki gibi OS'ye özgü bir şey kullanmak zorundasınız, [inotify] kullanabilirsiniz (http://en.wikipedia.org/wiki/Inotify). –

cevap

13

Disk dosyaları her zaman okumaya hazır (ancak dosyanın sonuna Zaten eğer okuma 0 bayt döndürebilir) ne zaman öğrenmek için disk dosyası üzerinde select() kullanamaması için, dosyaya yeni veriler eklenir.

POSIX diyor: Düzenli dosyalarla ilişkili

Dosya tanımlayıcılar her zaman okumaya hazır yazmaya hazır ve hata koşulları için geçerlidir seçeceklerdir. şimdi silinmiş yayında işaret Ayrıca

, cnicutar olarak, genel olarak, her tekrarında fd_set başlatmak zorundayız. Kodunuzda, bir fd'yi izliyorsunuz ve fd her zaman hazır, bu yüzden FD_SET aslında değişmiyor. Ancak, izlemek için 5 tane düzenleyiciniz varsa ve select, yalnızca birinin hazır olduğunu algılarsa, sonraki yinelemede yalnızca bir tanıtıcı izlenir (FD_SET'i sıfırlamadığınız sürece). Bu, select kullanımını zorlaştırır.

+1

bu, testlerime dayanarak doğru görünüyor. lanetlemek. – glutz

İlgili konular