디스크립터를 읽기 위한 논블로킹콜
fd 디스크립터를 가지고 있기 때문에 호출로 읽을 수 있습니다.read(fd, buffer,...)
콜이 차단되어 있기 때문에 실제로 콜을 발신하기 전에 읽을 것이 있는지 확인하고 싶습니다.이거 어떻게 해?
int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
위의 코드 스니펫에서는 이러한 디스크립터를 논블로킹액세스용으로 설정합니다.read 호출 시 데이터를 사용할 수 없는 경우 시스템콜은 -1의 반환값으로 실패하고 errno는 EAGAIN으로 설정됩니다.자세한 내용은 fnctl man 페이지를 참조하십시오.
또는 설정 가능한 타임아웃과 함께 select를 사용하여 지정된 시간 간격을 확인하거나 추가 데이터를 대기할 수 있습니다.이 방법은 아마도 여러분이 원하는 방법일 것이고 훨씬 더 효율적일 수 있습니다.
사용하다select
또는poll
파일 설명자에 읽을 수 있는 데이터가 있는지 쿼리하려면:
fd_set fds;
FD_ZERO(&fds);
FD_SET(&fds, fd);
if (select(fd+1, &fds, 0, 0)==1) /* there is data available */
조작에 따라서는, 문제를 파악해, 파일 기술자에 판독할 내용이 있는 경우에 를 사용해 통지할 수 있습니다.
use poll for timeout:
struct pollfd p;
int n;
while ((n = poll(&p, 1, iTo)) < 0)
{
if (errno == EAGAIN || errno == EINTR)
continue;
}
if (!n) {
errno = ETIMEDOUT;
}
while ((len = read(Fd, anyBuff, sizeof(anyenter code hereBuff))) < 0) {
if (errno == EAGAIN || errno == EINTR)
continue;
}
내 생각엔 네가 이걸 써야 할 것 같아요.select
또는poll
디스크립터에서 읽을 내용이 있는지 확인하는 함수입니다.
특정 프로그래밍 목적으로 사용하는 API 또는 시스템/툴을 확인하십시오.(설명자/파일 기술자는 소켓 프로그래밍, 파일 조작, shared_memory 등 Linux 프로그래밍에서 많은 용도로 사용됩니다.)
예를 들어 inotify(파일 시스템 이벤트 모니터링)를 사용한 적이 있습니다.이 API는 처음부터 논블로킹파일을 작성할 수 있는 기능을 제공하며 fcntl 등의 API를 사용하여 작성된 파일 기술자를 변경할 필요가 없습니다.
사용하는 다른 툴이나 API는 이러한 기능을 가지고 있을 가능성이 높으며, 이러한 옵션을 시작 단계나 단계에서 설정할 수 있습니다(이것부터 체크해 주세요).
그러나 일반적으로 fcntl을 사용하는 것이 정답이며 inotify 자체도 fcntl을 사용한다는 것을 아는 것이 흥미로울 수 있습니다.(Linux 매뉴얼 페이지 참조)
select()는 지정된 시간 내에 이벤트를 감시하기 위해 파일 기술자 상에서 동작하는 것과 동일한 기능을 제공할 수 있지만 select의 주요 용도는 여러 파일 기술자를 감시하는 것입니다.
언급URL : https://stackoverflow.com/questions/5616092/non-blocking-call-for-reading-descriptor
'programing' 카테고리의 다른 글
v-select of vuetify 구성 요소의 텍스트를 가운데 정렬하는 방법 (0) | 2022.08.03 |
---|---|
중첩된 형식 - vue (0) | 2022.08.01 |
메서드 이름 출력에 사용할 수 있는 매크로/키워드? (0) | 2022.08.01 |
Java 타이머와 Executor Service의 비교 (0) | 2022.08.01 |
C의 이 논리 AND 버전이 단락 동작을 나타내지 않는 이유는 무엇입니까? (0) | 2022.08.01 |