내가 원하는 것을 더 명확하게 설명하기 위해 사용자가 무언가를 입력했는지 확인하기 위해 코드를 확인해야합니다 (또는 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
무한 루프를 선언하는 경우, 무한이 인쇄의 핵심은 타임 아웃을 무시 것처럼 눌렀 음.
그런 간단한 코드가 작동하지 않는 이유는 알 수 없습니다. 내가 알지 못하는 파일 기술자에 대해 몇 가지 요점을 놓치고있다.
중복 질문 - 추적 해 보겠습니다. 기본적으로 모든 반복에서'readfds'를 설정해야합니다. 'select()'는 그것을 압축합니다. –
@JonathanLeffler "반복마다"'readfds'를 설정한다는 것은 정확히 무엇을 의미합니까? @iharob의 솔루션과 같은 것? 나는 이미 그것을 시도했지만 그 경우 프로그램은 "키가 눌려졌다"는 것을 무한히 인쇄합니다. – TheReader
iharob가 그의 답변에서 보여 주었던 것과 중복 된 질문이 답에서 무엇을 보여줬습니까? 'select'를 호출 한 후'readfds'의 값은'select'에 의해 수정되었으므로 루프의 반복마다 올바르게 초기화해야합니다. –