터미널 라인 입력 종료 Ctrl+D

터미널 라인 입력 종료 Ctrl+D

만약 내가한다면

$ cat > file.txt

텍스트 Ctrl- DCtrl-D

질문 1: Enter를 누르지 않으면 왜 Ctrl-를 D두 번 눌러야 합니까?

만약 내가한다면

$ cat > file.txt

파밤프쉬 Ctrl-Z

[2]+  Stopped         cat > file.txt
$ cat file.txt
$ cat > file.txt

파밤프쉬

Ctrl-Z

[2]+  Stopped         cat > file.txt
$ cat file.txt
pa bam pshhh

두 번째 파일은 왜 1줄인가요?

답변1

Unix에서는 읽고 쓸 수 있는 대부분의 개체(일반 파일, 파이프, 터미널, 원시 디스크 드라이브)가 모두 파일과 유사하게 만들어집니다.

cat다음과 같은 표준 입력에서 읽는 것과 같은 프로그램은 다음과 같습니다.

n = read(0, buffer, 512);

512바이트를 요구합니다. n실제로 읽은 바이트 수이고, 오류가 있는 경우 -1입니다.

일반 파일을 사용하여 이 작업을 반복적으로 수행하면 512바이트 읽기가 많이 발생하고 파일 끝 부분에서 다소 짧은 읽기가 발생하며 파일 끝을 지나서 읽으려고 하면 0이 됩니다. 따라서 <= 0이 될 cat때까지 실행됩니다 .n

터미널에서 읽는 것은 약간 다릅니다. Enter키로 끝나는 줄을 입력하면 read해당 줄만 반환됩니다.

입력할 수 있는 몇 가지 특수 문자가 있습니다. 하나는 Ctrl-D. 이것을 입력하면 운영 체제는 사용자가 입력한 현재 줄 전체(자체는 아님 Ctrl-D)를 읽기를 수행하는 프로그램에 보냅니다. 그리고 여기에 뜻밖의 사실이 있습니다. 만약 Ctrl-D가 줄의 첫 번째 문자라면 프로그램은 길이가 0인 줄로 전송됩니다. 마치 프로그램이 일반 파일의 끝에 도달했는지 확인하는 것과 같습니다.cat 다르게 할 필요는 없어, 일반 파일에서 읽는지 터미널에서 읽는지 여부.

또 다른 특수 문자는 입니다 Ctrl-Z. 한 줄의 아무 곳에나 입력하면 운영 체제는 해당 지점까지 입력한 내용을 모두 버리고 SIGTSTP 신호를 프로그램에 보냅니다. 프로그램은 일반적으로 프로그램을 중지(일시 중지)하고 제어권을 쉘로 반환합니다.

그래서 귀하의 예에서

$ cat > file.txt
pa bam pshhh<Ctrl+Z>
[2]+  Stopped         cat > file.txt

삭제된 일부 문자를 입력한 다음 cat출력 파일에 아무 것도 쓰지 않고 중지되었습니다.

$ cat > file.txt
pa bam pshhh
<Ctrl+Z>
[2]+  Stopped         cat > file.txt

cat출력 파일을 읽고 쓰는 한 줄을 입력한 다음 Ctrl-Z중지된 cat.

답변2

Ctrl+ D가 해킹이기 때문입니다 .

Deep down, Ctrl+ D(라고 불리지만eof성격)은 실제로 파일 끝을 의미하지 않습니다. "지금 응용 프로그램에 보류 중인 입력을 보냅니다"를 의미합니다. 이는 실제로 대기 중인 입력과 개행 문자를 보내는 Ctrl+ M( ) 의 의미에 가깝습니다 .eol

+ 바로 뒤 (즉, 줄의 시작 부분) 또는 다른 + 뒤에 Ctrl+를 누르면 보류 중인 입력이 비어 있습니다. 따라서 애플리케이션은 0바이트의 입력을 받습니다. 안에DCtrlMCtrlDread호출에서 0바이트를 읽으면 파일의 끝을 알립니다.


Ctrl+ 를 누르면 Z보류 중인 입력이 삭제됩니다. 따라서 +를 누르기 전에 줄 바꿈이나 +를 cat입력하여 이미 응용 프로그램에 전송된 내용( )만 처리됩니다.CtrlDCtrlZ

관련 정보