우리는 파일을 읽고 쓸 때 IO 작업이 수행하는 필수 기능을 알고 있습니다. 그러나 오래된 IO 작업으로 인해 프로그램이 실행되지 않고 지연이 발생할 수 있습니다. 비차단 IO 방법을 사용하여 이 문제를 해결할 수 있습니다. IO는 비차단이므로 IO 작업이 진행되는 동안 프로그램이 계속 실행될 수 있습니다. "선택" 기능은 비차단 IO를 제공하기 위해 C 프로그래밍 언어에서 자주 사용되는 도구입니다. '선택' 기능을 사용하면 소켓이나 파일 핸들과 같은 수많은 파일 설명자를 모니터링하여 읽기/쓰기 준비 상태 또는 오류를 모니터링하는 데 도움이 됩니다. "선택" 기능을 사용하면 프로그램 실행을 지연시키지 않고 여러 IO 작업을 효과적으로 관리할 수 있습니다. 여러 IO 리소스의 상태를 지속적으로 확인할 수 있는 방법을 제공합니다.
C 언어의 "select" 기능을 사용하여 Non-Blocking IO를 구현하는 방법에 대해 논의해 보겠습니다. "select"의 기본 사용법에 대해 논의하고 해당 응용 프로그램을 설명하는 프로그래밍 예제를 제공합니다.
'선택' 기능이 무엇인가요?
"select" 기능은 비차단 IO를 구현하는 데 도움이 되는 C 언어의 강력한 도구입니다. 이 기능을 사용하면 소켓이나 파일 핸들과 같은 여러 파일 설명자를 모니터링하여 읽거나 쓸 준비가 되었는지 확인할 수 있습니다. 이 함수는 읽기 세트, 쓰기 세트 및 예외 세트인 세 가지 파일 설명자 세트를 사용합니다. 이러한 세트를 사용하여 특정 작업에 대해 모니터링할 설명자를 지정할 수 있습니다. 이 함수는 이벤트를 기다리는 최대 시간을 지정할 수 있는 시간 초과 값을 사용합니다. 모니터링되는 설명자 중 하나에서 이벤트가 발생하거나 시간 초과가 만료되면 "select"가 반환되어 준비된 설명자에 대한 정보를 제공합니다. 이러한 방식으로 프로그램 실행을 차단하지 않고 IO 작업을 효율적으로 수행할 수 있으므로 여러 IO 작업을 처리하는 데 적합합니다.
비차단 IO에 대한 "선택" 기능은 여러 가지 이점을 제공합니다. 이를 통해 연결당 스레드를 요구하지 않고 여러 IO 작업을 효율적으로 처리할 수 있어 리소스 소비가 줄어듭니다.
그러나 "선택" 기능에는 모니터링할 수 있는 최대 파일 설명자 수와 같은 몇 가지 단점이 있으며 이는 종종 운영 체제에 의해 제한됩니다. 또한 파일 설명자의 수가 증가하면 '선택' 기능의 성능이 저하될 수 있습니다.
프로그래밍 예 1:
#include
#include
#include
#include
#include
#include
#include
#include
정수 메인()
{
// 모니터링할 파일 설명자
int fd1, fd2;
// 파일을 열거나 생성하고 비차단 모드로 설정하겠습니다.
fd1 =열기("file1.txt", O_RDONLY | O_NONBLOCK);
fd2 =열기("file2.txt", O_WRONLY | O_NONBLOCK);
fd_set read_fds, write_fds; // 파일 설명자 세트
구조체 timeval 시간 초과; // 선택 시간 초과
동안 (1)
{
FD_ZERO(&read_fds); // 읽기 세트를 지웁니다.
FD_ZERO(&write_fds); // 쓰기 세트 지우기
FD_SET(fd1, &read_fds); // 읽기 세트에 fd1을 추가합니다.
FD_SET(fd2, &write_fds); // 쓰기 세트에 fd2를 추가합니다.
timeout.tv_sec =4; // 시간 초과를 4초로 설정합니다.
timeout.tv_usec =0;
int Ready_fds =선택(fd2 + 1, &read_fds, &write_fds, NULL, &timeout);
if (ready_fds ==-1) {
perror("선택");
종료(EXIT_FAILURE);
}
else if (ready_fds ==0) {
printf("시간 초과가 발생했습니다\n");
}
그렇지 않으면
{
if (FD_ISSET(fd1, &read_fds)) {
// fd1을 읽을 준비가 되었습니다.
문자 버퍼 [100]; // 읽을 버퍼를 생성합니다.
ssize_t bytesRead =read(fd1, buffer, sizeof (버퍼) - 1);
if (bytesRead> 0) {
버퍼 [bytesRead] ='\0'; // 문자열을 Null로 종료합니다.
printf("file1.txt에서 읽기:%s \n", buffer);
}
}
if (FD_ISSET (fd2, &write_fds)) {
// fd2는 쓰기 준비가 되었습니다.
const char* message ="좋은 아침입니다";
ssize_t bytesWritten =쓰기(fd2, 메시지, strlen(메시지));
if (bytesWritten> 0) {
printf("file2.txt에 썼습니다:%s \n", 메시지);
}
}
}
}
// 파일 설명자를 닫겠습니다.
닫기(fd1);
닫기(fd2);
0을 반환합니다.
}
출력:
file2.txt에 작성:안녕하세요.
file2.txt에 작성:안녕하세요.
file2.txt에 작성:안녕하세요.
file2.txt에 작성:안녕하세요.
시간 초과가 발생했습니다
설명:
프로그램에서는 "file1.txt"와 "file2.txt"라는 두 파일을 모니터링하기 위해 C 언어로 "select"를 사용하여 비차단 IO를 구현합니다. 파일을 비차단 모드로 설정합니다. 이는 이제 파일이 완전히 읽히거나 쓰여질 때까지 기다리지 않고 프로그램이 계속 실행될 수 있음을 의미합니다. 프로그래밍 예제에서는 "선택" 기능을 사용하여 지정된 시간 초과 기간 내에 파일에 대한 활동이 있는지 확인합니다. 타임아웃 동안 아무런 활동이 없으면 “Timeout 발생”만 출력합니다. 활동이 있으면 어떤 파일에 활동이 있는지 확인합니다. “file1.txt”에 활동이 있으면 프로그램은 파일의 내용을 읽고 인쇄합니다. “file2.txt”에 활동이 있으면 파일에 “Good morning” 메시지를 인쇄합니다. 프로그램은 종료될 때까지 계속해서 파일을 무기한 모니터링합니다. 마지막으로 파일 설명자를 닫아 시스템 리소스를 해제합니다.
결론
C의 "select" 함수는 비차단 I/O 작업을 구현하는 좋은 솔루션을 제공합니다. 여러 파일 설명자를 모니터링할 수 있으므로 프로그램 실행을 차단하지 않고 여러 I/O 작업을 효율적으로 처리할 수 있습니다. 하지만 모니터링할 수 있는 최대 파일 설명자 수, 설명자가 많을 경우 잠재적인 성능 문제 등의 단점을 고려하는 것이 중요합니다. 이러한 결함에도 불구하고 "select" 기능은 C 프로그램의 비차단 I/O를 관리하는 데 여전히 좋은 선택입니다.
작가 소개
밤데브 고쉬
Bamdeb Ghosh는 무선 네트워킹 분야에서 실무 경험을 갖고 있습니다. 그는 Android, Bluetooth, Linux 명령 및 Python에 대한 지식과 함께 무선 또는 유선 네트워킹에 대한 Wireshark 캡처 분석 전문가입니다. 그의 사이트를 팔로우하세요:wifisharks.com