2012-05-19 21 views
5
#include <stdio.h> 
#include <unistd.h> 
#include <sys/time.h> 
#include <sys/types.h> 

int main() 
{ 
char   name[20]; 
fd_set   input_set; 
struct timeval timeout; 
int    ready_for_reading = 0; 
int    read_bytes = 0; 

/* Empty the FD Set */ 
FD_ZERO(&input_set); 
/* Listen to the input descriptor */ 
FD_SET(0, &input_set); 

/* Waiting for some seconds */ 
timeout.tv_sec = 10; // 10 seconds 
timeout.tv_usec = 0; // 0 milliseconds 

/* Invitation for the user to write something */ 
printf("Enter Username: (in 15 seconds)\n"); 
printf("Time start now!!!\n"); 

/* Listening for input stream for any activity */ 
ready_for_reading = select(1, &input_set, NULL, NULL, &timeout); 
/* Here, first parameter is value of the socket descriptor + 1 (STDIN descriptor is 0, so 
* 0 +1 = 1) 
* in the set, second is our FD set for reading, 
* third is the FD set in which any write activity needs to updated, which is not required 
* in this case. Fourth is timeout 
*/ 

if (ready_for_reading == -1) { 
    /* Some error has occured in input */ 
    printf("Unable to read your input\n"); 
    return -1; 
} else { 
    if (ready_for_reading) { 
     read_bytes = read(0, name, 19); 
     printf("Read, %d bytes from input : %s \n", read_bytes, name); 
    } else { 
     printf(" 10 Seconds are over - no data input \n"); 
    } 
} 

return 0; 

} aynı şeyi değil, sadece bir kez, ancak karşılaşmadan sonra kırar sonsuz döngüye dize 'çıkın' Nasıldöngü nasıl seçilir() veri sonsuza yoklamak

(örneğin) . Her şekilde denedim - başarısız oldu. 10 saniye sonra hiçbir veri girilmediyse, sadece "10 saniye bitti - veri girişi yok" yazdırır ve tekrar beklemeye başlar. Girdikten sonra aynı - sadece tekrar başlar ve sonsuz döngüde her zaman aynı davranır.
Çok az umutsuzum lütfen - yardım.
Teşekkürler.

+3

Her şeyi bir while (! Strcmp (name, "quit")) döngüsüne veya başka bir şeye koyun. :-) –

+0

"Burada ilk parametre, kümedeki FD sayısıdır" ** no **. En yüksek FD numarası artı bir olmalı. Lütfen adam sayfasını tekrar kontrol et. – Mat

+1

http://linux.die.net/man/2/select_tut adresinin altındaki örnek tam olarak istediğiniz şeydir. –

cevap

4

Gerçekten burada sorun görmüyorum. Temel olarak, sadece döngüde istediğiniz her şeyi koymak ve koşmasına izin verin. Bunu denedin mi? bir sonraki tekrarda yine cevap verecektir böylece var

int main() 
{ 
    /* Declarations and stuff */ 
    /* ... */ 

    /* The loop */ 
    int break_condition = 0; 
    while (!break_condition) 
    { 
     /* Selection */ 
     FD_ZERO(&input_set); /* Empty the FD Set */ 
     FD_SET(0, &input_set); /* Listen to the input descriptor */ 
     ready_for_reading = select(1, &input_set, NULL, NULL, &timeout); 

     /* Selection handling */ 
     if (ready_for_reading) 
     { 
      /* Do something clever with the input */ 
     } 
     else 
     { 
      /* Handle the error */ 
     } 

     /* Test the breaking condition */ 
     break_condition = some_calculation(); 
    } 
    return 0; 
} 

Not döngü içine seçimi devamlı resetlenmesine olması.

+0

Hepinize çok teşekkür ederim. Sonunda çözüldü! :))) Sorun, seçim argümanlarını yalnızca bir kez başlattığım ve bunları her defasında seçtiğim sırada başlatmam gerektiğinde birden çok kez kullanmamdır. Gerçekten çok teşekkür ederim. !!!! Selamlar – azrahel

0

select() işlevinin zaman aşımını NULL olarak ayarlayarak süresiz olarak engellenmesi söylenebilir. select (2) man sayfasına bakınız:önce geçen sürenin miktarına üst sınırdır

zaman aşımını() döner seçin. zaman dilimi yapısının her iki alanı sıfır ise, seçe() hemen döner. (Bu yoklama için kullanışlıdır.) zaman aşımı zaman aşımı NULL (zaman aşımı yok), seç() süresiz olarak engelleyebilir.

Yani ne istiyorsun:

... 
ready_for_reading = select(1, &input_set, NULL, NULL, NULL); 
...