Rustlang) std::io

DongSub_Joung·2022년 1월 5일
0

std::io

목록 보기
2/4
post-thumbnail

개인적으로 이 글을 읽기 위해서는 "병렬 처리 및 병렬 프로세스"에 관한 선행된 지식이 필요합니다.

https://doc.rust-lang.org/std/io/struct.Stdin.html

std::io::Stdin

'a global buffer of input data to this process'에 대한 점유를 할 수 있는 핸들러를 가리킵니다.

핸들러는 병렬처리에 의한 자원 독점('lock')을 이용하여 'BufRead methods의 전체적인 접근 권한을 얻습니다.

해당 핸들러는 'the Read trait'을 제공하지만 병렬 처리에서의 Read는 유의해서 처리해야 합니다.


pub fn lock(&self) -> StdinLock<'_>

(병렬 처리에 있어서의 자원 점유를 위한) readable 가드를 반환하는 표준 핸들러, scope에서 벗어나면 해제된다.
추가적인 구성요소로 아래의 trait들을 제공함.

EX

use std::io::{self, BufRead};

fn main() -> {
    let mut buffer = String::new();
    let stdin = io::stdin();
    let mut handle = stdin.lock();

    handle.read_line(&mut buffer).expect("Err: can't read");
}

pub fn read_line(&self, buf: &mut String) -> Result

  • 'a line of input', appending it to the specified buffer.
  • 'bytes'(the 0xA byte) or EOF
  • the total number of bytes read.
  • BufRead::read_line

이 메서드에서 문제가 발생하는 것 같다. 자원 공유에서의 blocking이 문제인가? 값이 제대로 할당되지 않는 문제로 계속 input이 실행된다.

// *Infinit loop* 
    io::stdin().read_to_string(&mut buf).expect("msg");

pub fn into_locked(self) -> StdinLock<"'"static>

  • locking the shared global buffer associated with the stream and returning a readable guard.
  • simpler to directly get a locked handle
#![feature(stdio_locked)]
  use std::io::{self, BufRead};
  
  fn main() -> io::Result<()>{
  	let mut buffer= String::new();
    let mut handle= io::stdin().into_locked();
  	
  	handle.read_line(&mut buffer)?;
  	Ok(())
  }
  

#![feature] may not be used on the stable release channel
코드 실행이 안된다. lock을 애용하자. // #86845


pub fn lines(self) -> Lines<StdinLock<"'"static>>

  • returns an iterator
  #![feature(stdin_forwarders)]
  use std::io;

  let lines = io::stdin().lines();
  for line in lines {
      println!("got a line: {}", line.unwrap());
  }

stdin_forwarders 실행안됨. // #87096


pub fn split(self, byte: u8) -> Split<StdinLock<"'"static>>

  • an iterator over input bytes // #87096

0개의 댓글