dukDukz

[Linux] IO 입출력 본문

웹 개발/Linux

[Linux] IO 입출력

헤일리_HJ 2021. 8. 30. 17:02

# stdin stdout

std in
std out 을 통해서 입출력이 가능하다.


1) stdout 출력


$ vi test.js

console.log('hello')
process.stdout.write('world')


$ node test.js

 

console.log 라는것은 브라우저와 node 에서 쓰이는게 다르다 그냥 같은 명령어로 쓰일 뿐
console.log 라는 것은 process.stdout.write 을 조금 변경해서 쓰이는것이다.
이게 IO 중 out 즉 출력하는 쪽의 내용이다.

 

2) stdin 입력

 

process.stdin.resume()

 

이렇게 하고
$ node test.js 하면 입력만 쭉 받게 된다.
그래서 종료를 하려면 ctrl + c 해야된다.

 

 


# nodejs : 논 블록킹 IO

node js 의 장점?
논 블록킹 IO 
다른 언어와 다른 점이다!!
싱글 스레드 이기 때문에 가능한것이다..!!
그래서 쭉 입력만 받는것임

그러면 입력받은 거를 출력하고자 한다면?

이벤트 쪽으로 처리를 해야한다.

 


# stdin 으로 입력받아서 출력하기 (callback 함수 이용)

 

$ vi test.js

// showData 라는 콜백함수를 만들어주고
process.stdin.on('data',showData)

// 함수는 인자값을 받아줘야한다.
function showData(value){
	console.log(value)
}

저장하고 node test.js

 

하면

hello world
<Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64 0a>


이런식으로 나온다.
알 수 없는 언어로.. Buffer - 컴퓨터만 알 수 있는 무언가..

 

저 Buffer 를 우리가 알 수 있는 내용으로 바꿔보자
Buffer to string

process.stdin.resume()
process.stdin.on('data',showData)

function showData(value){
	console.log(value.toString('utf8'))
}


value.toString('utf8')
로 바꿔줘야한다.

그러면 이제 인코딩 된 상태로 잘 나오게 된다.

 


 

# 특정값이 입력되었을때 stdin 이 끝나도록 해보기

그리고 이제 강제적으로 종료하지 않고 특정값이 들어왔을때 꺼지도록 해보자

 

process.stdin.resume();

: stdin을 실행하기

process.stdin.resume()
process.stdin.on('data',showData)

function showData(value){
        let data = value.toString('utf8')
        console.log(data)
        if( data === "10"){
                process.exit(0)
        }
}

이렇게 해준다.
0 은 성공적인 의미로 생각

일단은 이렇게 종료한다는.

근데 10 을 해도 꺼지지는 않음...

data === "10"
그럼 10 일때 true 여야 하는데 그게 안되는거임
입력할 때 tab 이나 enter 같은게 껴있어서 그럼

 

 

process.stdin.resume()
process.stdin.setEncoding('utf8')

process.stdin.on('data',showData)

function showData(value){
        let data = value.trim()
        console.log(data, data==="10")
        if( data === "10"){
                process.exit(0)
        }
}

따로 빼서 인코딩 시키고 data로 보내주는걸로 바꿔준다.

 

그래서 toString('utf8').trim()
뒤에 공백이나 이런걸 없애주는 녀석을 써줘야함

그러면 이제 10일때 true 가 되면서 종료됨