programing

디스크립터를 읽기 위한 논블로킹콜

newsource 2022. 8. 1. 22:51

디스크립터를 읽기 위한 논블로킹콜

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