I/O는 Input/Output의 약자입니다.
입력이란 무언가(컴퓨터, Ruby 방식, 두뇌)로 들어오는 모든 데이터 및 정보를 의미합니다.
입력의 예 :
- 키보드에서 누르는 키
- 마우스 클릭
- 읽은 책
출력이란 입력의 결과로 나오는 모든 것을 의미합니다.
출력의 예 :
- 1 + 1의 결과
- 읽은 기사 요약하기
- 커피
Ruby에서 i/o에 대해 이야기할 때 일반적으로 파일 읽기, 네트워크 소켓 작업 및 화면에 정보 인쇄를 참조합니다.
IO 클래스 이해
IO는 Ruby의 클래스이기도 합니다.
File
과 같은 다른 객체의 부모 클래스입니다. &Socket
.
모든 IO 개체에는 다음 작업이 있습니다. :
- 열기/닫기
- 읽기
- 쓰기
IO 개체는 파일 설명자를 기반으로 합니다. .
컴퓨터에서 실행 중인 모든 프로세스에는 내부 정보 테이블이 있습니다.
이 표의 일부에는 파일 설명자 목록이 포함되어 있습니다.
파일 설명자는 정수와 파일 이름 간의 매핑입니다. .
Linux에서 이 파일 설명자 목록을 볼 수 있습니다.
이 명령으로 :
# Assuming you have irb open on another window ls -lh /proc/`pgrep irb`/fd/ # lrwx------ 1 jesus jesus 64 Feb 3 15:54 0 -> /dev/pts/3 # lrwx------ 1 jesus jesus 64 Feb 3 15:54 1 -> /dev/pts/3 # lrwx------ 1 jesus jesus 64 Feb 3 15:54 2 -> /dev/pts/3
sysopen
을 사용하여 Ruby에서 새 파일 설명자를 만들 수 있습니다. 방법.
예 :
fd = IO.sysopen('/dev/null', 'w') # 10
이제 이 파일 설명자로 통신 채널을 열 수 있습니다(10
).
좋아요 :
io = IO.new(fd)
그리고 쓰기 :
io << 'orange'
IO
파일 설명자가 실제 파일, 장치(예:하드 디스크) 또는 네트워크 소켓에 매핑되는지 여부는 상관하지 않습니다.
쓰기를 위해 파일 설명자를 여는 방법
sysopen
을 사용하여 새 파일 설명자를 만들 때 , 또는 File.open
을 사용하여 파일을 엽니다. , 몇 가지 옵션이 있습니다.
기본적으로 통신은 읽기 전용입니다.
모드를 지정할 수 있습니다. :
r
(읽기, 기본값)w
(쓰기)w+
(읽기 및 쓰기)a
(추가)
예 :
fd = IO.sysopen('/dev/tty1', 'w+')
그러면 /dev/tty1
이 열립니다. 읽기 + 쓰기 모드로.
3 표준 IO 스트림
새 프로그램(편집기, 터미널, Ruby 인터프리터 등)을 열면 기본적으로 3개의 통신 채널이 열립니다.
3개의 파일 설명자.
그들은 :
- stdin(입력)
- stdout(출력)
- stderr(오류)
Ruby에서는 상수 형식이나 전역 변수 형식을 사용하여 직접 액세스할 수 있습니다.
예 :
$stdout << "abc\n"
$stdout
에 쓸 때 , puts 메소드를 호출하는 것과 같습니다.
표준 출력 터미널과 연결되어 있습니다.
lrwx------ 1 jesus jesus 64 Feb 3 15:54 0 -> /dev/pts/3
이 /dev/pts/3
터미널이 화면에 텍스트를 표시하기 위해 읽는 가상 장치입니다.
표준 오류 출력에도 사용되지만 터미널에서 더 큰 글꼴이나 일반 텍스트와 다른 색상과 같은 다른 방식으로 이 콘텐츠를 표시할 수 있습니다.
warn
를 사용할 수 있습니다. 표준 오류로 인쇄하는 방법입니다.
표준 입력 사용자 입력을 읽는 곳입니다.
gets
을 사용할 수 있습니다. 표준 입력에서 읽는 방법.
STDOUT을 플러시하고 버퍼링을 비활성화하는 방법
IO 개체에는 내부 버퍼가 있습니다.
일정량의 입력 데이터를 읽기 전에 저장합니다. .
이것이 때때로 puts
를 사용하는 이유입니다. ...
하지만 프로그램이 끝나거나 버퍼가 가득 찰 때까지 아무 것도 볼 수 없습니다!
이와 같이 버퍼링을 비활성화할 수 있습니다. :
$stdout.sync = true
또는 수동으로 버퍼를 플러시할 수 있습니다. :
$stdout.flush
버퍼를 비활성화하면 기다릴 필요 없이 출력을 볼 수 있습니다.
청크 읽기
IO 개체에서 읽을 때 read
스트림이 END-OF-FILE(EOF) 신호로 끝날 때까지 스트림이 닫히거나 특정 양의 바이트를 수신합니다.
네트워크 프로그래밍 및 대용량 파일의 경우 작은 덩어리로 읽는 것이 도움이 됩니다.
이와 같은 청크로 읽을 수 있습니다. :
data = "" until io.eof? data << io.read(2048) end
이 코드를 사용하면 전체 다운로드가 완료될 때까지 기다릴 필요 없이 데이터가 사용 가능해지면 처리할 수 있습니다.
eof?
"차단"합니다.
차단은 코드가 휴면 상태가 된다는 것을 의미합니다. 운영 체제에서 읽을 새 데이터가 있음을 알립니다. .
양방향 통신을 위해 IO 파이프를 사용하는 방법
Ruby를 사용하면 파이프를 만들 수 있습니다.
파이프는 서로 연결된 파일 설명자 쌍입니다.
IPC(프로세스 간 통신)에 사용됩니다.
예 :
read, write = IO.pipe
fork
와 함께 사용할 수 있습니다. 메서드(Windows에서는 사용할 수 없음)를 사용하여 현재 프로세스의 복사본을 만듭니다.
이 두 프로세스는 파이프를 사용하여 통신할 수 있습니다.
예 :
if fork write.close puts "Message received: #{read.gets}" read.close else read.close write << "Buy some bananas!" write.close end
결과 :
# Message received: Buy some bananas!
커널 오픈 방식 사용 방법
Ruby에는 매우 유연한 open
이 있습니다. 방법.
파일을 열고 URL에서 데이터를 읽을 수 있으며 파이프를 열어 외부 명령을 실행할 수도 있습니다.
예 :
open "abc.txt"
그렇기 때문에 이 방법은 피해야 합니다 .
이러한 모든 작업을 수행할 수 있다는 것은 보안상의 위험입니다.
대신 특정 open
을 사용하는 것이 좋습니다. 필요한 방법입니다.
예 :
File.open # File IO.popen # Process open URI.parse(...).open # URL open
이들 모두는 IO
를 반환합니다. 개체.
요약
Ruby의 입력/출력에 대해 배웠습니다! 파일 설명자 IO
에 대해 배웠습니다. 클래스, 버퍼링, 청크 읽기 및 표준 IO
스트림.
이 기사가 마음에 들면 공유하는 것을 잊지 마십시오.
읽어주셔서 감사합니다.