2014-12-23 2 views
0

내가 원하는 것을 더 명확하게 설명하기 위해 사용자가 무언가를 입력했는지 확인하기 위해 코드를 확인해야합니다 (또는 0 이외의 다른 파일 설명자에 읽을 데이터가있는 경우).) (말하자면) 2.5 초마다 프로그램이 멈출 때까지.사용자가 무언가를 입력하면 문장 간 전환

사용자가 무언가를 입력하면 printf()이 간단히 알려주고 사용자가 다음 2,5 초 내에 무언가를 입력하면 다시 확인합니다.

그 외에는 시간이 부족하다는 것을 인쇄해서 다음 2,5 초 동안 사용자 입력을 다시 확인해야합니다.

그리고 여기가 (시도) 내 요구 사항을 충족 내가 Beej's Guide to Network Programming에서 훔쳐로 수정 된 코드입니다 :

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

#define STDIN 0 // file descriptor for standard input 

int main(void){ 
    struct timeval tv; 
    fd_set readfds; 

    FD_ZERO(&readfds); 
    FD_SET(STDIN, &readfds); 

    tv.tv_sec = 2; 
    tv.tv_usec = 500000; 

    while(1){ 
     select(STDIN+1, &readfds, NULL, NULL, &tv); 

     if (FD_ISSET(STDIN, &readfds)){ 
      printf("A key was pressed!\n"); 
      tv.tv_sec = 2; 
      tv.tv_usec = 500000; 

     }else{ 
      printf("Timed out.\n"); 
      tv.tv_sec = 2; 
      tv.tv_usec = 500000; 

     } 

    } 
    return 0; 
} 

만큼 내가 어떤 키를 누르지이 잘 작동 및 인쇄 "시간이 초과되었습니다. " 매 2,5 초. 하지만 뭔가를 입력하면 으로 사용자 입력을 무시하고 "Timed out"으로 인쇄됩니다. 내가 뭔가를 입력하면 다른 한편으로

, 나는 fd_set 및 내부의 struct timeval무한 루프를 선언하는 경우, 무한이 인쇄의 핵심은 타임 아웃을 무시 것처럼 눌렀 음.

그런 간단한 코드가 작동하지 않는 이유는 알 수 없습니다. 내가 알지 못하는 파일 기술자에 대해 몇 가지 요점을 놓치고있다.

+0

중복 질문 - 추적 해 보겠습니다. 기본적으로 모든 반복에서'readfds'를 설정해야합니다. 'select()'는 그것을 압축합니다. –

+0

@JonathanLeffler "반복마다"'readfds'를 설정한다는 것은 정확히 무엇을 의미합니까? @iharob의 솔루션과 같은 것? 나는 이미 그것을 시도했지만 그 경우 프로그램은 "키가 눌려졌다"는 것을 무한히 인쇄합니다. – TheReader

+0

iharob가 그의 답변에서 보여 주었던 것과 중복 된 질문이 답에서 무엇을 보여줬습니까? 'select'를 호출 한 후'readfds'의 값은'select'에 의해 수정되었으므로 루프의 반복마다 올바르게 초기화해야합니다. –

답변

1

당신은 재설정해야하기 때문에 - 당신도해야 볼 시간 종료에 파일 기술자가 설정

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

#define STDIN 0 // file descriptor for standard input 

int main(void){ 
    struct timeval tv; 
    fd_set readfds; 

    while (1) { 
     int count; /* how many descriptors are contained in the set. */ 

     FD_ZERO(&readfds); 
     FD_SET(STDIN, &readfds); 

     tv.tv_sec = 2; 
     tv.tv_usec = 500000; 

     count = select(STDIN + 1, &readfds, NULL, NULL, &tv); 
     if ((count > 0) && (FD_ISSET(STDIN, &readfds) != 0)) { 
      printf("A key was pressed!\n"); 
     } else if (count == -1) 
      /* check for the error here */ 
     } else { 
      printf("Timed out.\n"); 
     } 
    } 
    return 0; 
} 

에서 제거되기 때문에>FD_SET(STDIN, &readfds)마다 select 반환 - 파일 desciptor을>FD_ZERO(&readfds) 당신의 readfds를 추가합니다 select에서 반환 값을 확인하여 오류가있는 경우 오류를 확인한 다음 errno을 확인한 다음 확인하십시오. 관심있는 파일 디 립터가 readfds에 포함되어 있는지 확인하십시오.

+0

이 기능이 제대로 작동합니까? 어쨌든, 최종 오류를 포착하는 것에 대해 상기시켜 주셔서 감사합니다. – TheReader

+0

나는 그것이 정말로 확실하다. :) –