표준 입력의 끝을 알리는 방법


82
  1. Bash에서는 결말 신호가 여기 문서에 의해 변경 될 수 있음을 알게되었습니다. 그러나 기본적으로 stdin 입력의 끝을 어떻게 신호 할 수 있습니까?
  2. 고양이와 chardet을 사용하면 stdin 입력이 Ctrl + d로 완료되었음을 알 수 있습니다. 그러나 Ctrl + d 및 Ctrl + c는 실행중인 명령의 실행을 끝내는 것과 비슷하다는 것을 기억합니다. 내가 틀렸어?

답변:


114

Ctrl+D터미널에서 줄의 시작 부분에 입력하면 입력의 끝을 나타냅니다. 이것은 유닉스 의미 의 신호 가 아닙니다 : 응용 프로그램이 터미널에서 읽고 사용자가을 누르면 Ctrl+D응용 프로그램은 파일의 끝 부분에 도달했음을 알립니다 (파일에서 읽거나 마치 마지막 바이트).

Ctrl+CSIGINT 신호를 보냅니다 . 기본적으로 SIGINT (인터럽트 신호)는 포 그라운드 응용 프로그램을 종료하지만 응용 프로그램은 신호를 포착하고 다른 방식으로 반응 할 수 있습니다 (예 : 셸 자체가 신호를 포착하고 입력을 시작한 행을 중단하지만 ' 종료하면 새 프롬프트가 표시되고 새 명령 줄을 기다립니다.

당신은 끝 파일와 SIGINT와 관련된 문자를 변경할 수 있습니다 stty명령을, 예를 들면 stty eof a만들 것 a파일 끝 문자를, 그리고 stty intr ^-SIGINT 문자를 사용하지 않도록한다. 이것은 거의 유용하지 않습니다.


감사! Ctrl+DCtrl과 대문자 D를 의미 합니까, 아니면 중요하지 않습니까?
Tim

5
@Tim : 당신이 원하는 소문자입니다 ... 대문자로 키보드 명령을 작성하는 규칙은 키보드의 레이블이 항상 대문자이며 설명되는 것은 프로그램이 보는 실제 문자 코드가 아니라 KEY SEQUENCE이기 때문에 발생합니다. 예, 때때로 혼란 스럽습니다.
Caleb

@Caleb : 감사합니다! 열쇠가 자본임을 어떻게 명시 할 것인가? 아니면 그런 경우가 있습니까?
Tim

단말기의 키 조합 @ 팀 Ctrl+Shift+DCtrl+D어쨌든 동일한 문자를 전송 (문자 번호 4, 보통 호출 Ctrl+D).
Gilles

2
@Tim 터미널에 Ctrl + D가 수신되었습니다. 프로그램에 문자를 보내지 않습니다. 프로그램이 터미널에서 읽을 때 터미널은 프로그램이 디스크 파일의 끝 이후에 읽으려고 할 때와 마찬가지로 "파일의 끝입니다"라고 알려줍니다. 껍질은 전혀 관여하지 않습니다.
Gilles

23

두 번째 요점은 완전히 다른 두 가지를 함께 모은 것입니다.

  • Ctrl + C는 실행중인 프로세스에 종료 신호를 보냅니다.
  • Ctrl + D는 전송 종료 문자를 보냅니다 .

당신은 후자를 찾고 있습니다.


7
혼란의 가능성 : 애플리케이션 관점에서 ^ D에 대한 실제 문자는 전송되지 않습니다. 즉, 응용 프로그램이 read(2)syscall 에서 해당 문자를받지 못합니다 .
ulidtko
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.