Cc로 ed를 종료 할 수없는 이유는 무엇입니까?


20

ed최소한의 텍스트 편집기 인 프로그램 은 Ctrl- 를 사용하여 인터럽트를 보내서 종료 할 수 없으며 C대신 "?"오류 메시지를 인쇄합니다. 콘솔에. ed인터럽트를 수신했을 때 종료 되지 않는 이유는 무엇 입니까? 명백한 오류 메시지가 종료하는 것보다 더 유용한 이유는 없습니다. 이 동작은 많은 새로운 사용자를 다음과 같은 상호 작용으로 연결합니다.

$ ed
hello
?
help
?
exit
?
quit
?
^C
?
^C
?
?
?
^D
$ su
# rm -f /bin/ed

이러한 비극적 인 폐기물 — ed단순히 중단하기로 합의 하면 쉽게 피할 수 있습니다.

비슷한 행동을 보이는 또 다른 완고한 프로그램은 less무시할만한 많은 이유가없는 것으로 보인다 C-c. 왜이 프로그램들이 힌트를 얻지 않습니까?


4
대화식 응용 프로그램은 비대화 식과 다릅니다. 사용하는 Ctrl-C 동작은 비 대화식 동작의 기본값입니다. 대화식 기능은 자체 목적으로 Ctrl-C의 동작을 무시할 수 있습니다.
jw013

4
또한 농담
jw013

@ jw013 네, "일반적인 세션"은 농담이었습니다. 내가 이해하지 못하는 것은 이러한 응용 프로그램이 실제로 유용한 것을 제공하지 않으면 Ctrl-C의 동작을 무시하도록 선택하는 이유 입니다.
Lily Chung

1
이 질문은 "ed를 종료하는 방법"에 대한 최고의 Google 검색 답변으로 표시되므로 여기에 'q'와 그에 따른 반품을 추가하고 싶습니다. 많은 Bothans가 우리에게이 정보를 제공하기 위해 죽었습니다.
Dmitri

답변:


19

Ctrl+ CSIGINT를 보낸다 . SIGINT의 일반적인 동작은 프로그램의 최상위 루프로 돌아가서 현재 명령을 취소하고 프로그램이 다음 명령을 기다리는 모드로 들어가는 것입니다. 비 대화식 프로그램 만 SIGINT에서 죽어야합니다.

따라서 Ctrl+ C는 ed를 죽이지 않지만 최상위 루프로 돌아가는 것은 당연합니다 . Ctrl+ C는 현재 입력 라인을 중단하고 ed 프롬프트로 돌아갑니다.

같은 덜 간다 : Ctrl+ C인터럽트 현재 명령을 다시 프롬프트의 명령을 제공합니다.

역사적인 이유로 ed는 SIGQUIT ( Ctrl+ \)를 무시합니다 . 일반 응용 프로그램은이 신호를 포착하지 않아야하며 활성화 된 경우 코어 덤프와 함께 자체 종료 될 수 있습니다.


@Kzqai 아니오, 일반적인 응용 프로그램은 SIGQUIT를 포착 해서는 안됩니다 . 비상구를 의미합니다.
Gilles 'SO- 악마 그만해

아. 좋아, 철회했다.
Kzqai

18

유닉스 V7의 ed(1)소스 코드 이 높은 계몽 헤더 주석 중 하나는 몇 가지 의견을 나타낼 수있는 원시적 인 1762 선 C 프로그램입니다 :

/*
 * Editor
 */

소스 코드 자체는 이론적 근거를 제공하지 않으므로 프로그램 작성자에게만 제공됩니다.

ed원래 PDP-11 어셈블리에서 Ken Thompson이 작성 했지만 실제로는 C로 이식 한 사람과 대화해야합니다. Dennis Ritchie 는 Unix 용 C를 만들었 으므로 C를 사용한 많은 사람 중 하나였습니다. 비 PDP 시스템에 Unix를 이식 가능하게 만듭니다. 하지만 리치 박사는 더 이상 그런 질문에 답하지 않습니다.

코드를 읽었을 때 편집 된 문서의 코어 내 사본의 내용을 보존하려고 시도 했습니다. 다른 텍스트 편집기도에서 죽지 않습니다 Ctrl-C.

여기에 무슨 일 ed이 있습니다 Ctrl-C:

onintr()
{
    signal(SIGINT, onintr);
    putchr('\n');
    lastc = '\n';
    error(Q);
}

(예, K & R C. steenkin '반환 형식 지정자 또는 매개 변수 선언이 필요하지 않습니다.)

영어로 번역 ed:

  1. 신호 처리기를 다시 등록합니다.

    (Unix는 1980 년대 중반 4.3BSD까지 자동 재설정 신호를받지 못했습니다 .)

  2. 새 행을 작성하고 전역 변수를 통해 행을 기억합니다 lastc.

    ( ed.c60 개의 전역 변수가 있습니다.)

  3. 사용자의 관점에서 print 이상으로 유명한error() 함수를 호출합니다 .?

다시 말해서, "정말 그렇게하려는 의도가 아니 었습니까?"


2
또한 많은 텍스트 편집기가 Control-C에서 종료되지 않습니다. Vim도 그렇지 않습니다. 나노도 마찬가지입니다. 나는 emacs도 그렇게 생각하지 않지만 테스트를 위해 설치하지는 않았다.
derobert

3
@derobert Vi는 Ctrl + C를 Unix 방식으로 처리합니다. 최상위로 돌아갑니다. Emacs는 Unix 이외의 출처로 인해 고유 한 키 바인딩을 가지고 있습니다. Unix의 Ctrl + C에 해당하는 Emacs는 Ctrl + G (종 문자-종을 울려 컴퓨터에서 종을 울림)
Gilles 'SO-stop

@derobert : 페어 포인트. 나는 이것을 대답에 추가했다.
워렌 영

2
@Gilles : 전화의 부작용 중 하나 error(s)에서이 ed.c메인 루프 처리로 복귀한다. 그것은 longjmp()전화로 그렇게 합니다. 떨림
워렌 영 1

1
자세한 내용과 역사 수업에 감사드립니다. 이것은 대단한 읽기였습니다!
alichaudry

7

ed다른 대화 형 프로그램과 마찬가지로 Ctrl+ C를 사용 하여 프로그램 자체의 작업을 중단합니다.
이것은 쉘에서 실행중인 작업을 중단시키는 일반적인 경우와 매우 유사합니다-명령.

사용자 관점에서 두 변종은 매우 유사합니다. 신호 처리는 다릅니다. 일반적인 경우 신호 SIGINT는 포 그라운드 프로세스, 실행중인 명령으로 전송되고 명령은 종료 하여 신호를 처리합니다.
의 경우 ed신호는 포 그라운드 프로세스 인 ed인스턴스로 전송됩니다 . 에서 실행중인 작업이 있으면 ed중단되고 프롬프트가 표시됩니다. 실행중인 작업이 없으면 아무것도 변경되지 않습니다.

쉘이 Ctrl+ C처럼 종료되지 않는 방법에 주목하십시오 ed. 그리고 그것은 Ctrl+에서 종료됩니다 D. 다시 말하지만ed


3

ed관심 있는 세 가지 신호가 있습니다 .

  1. INT
  2. HUP
  3. QUIT

POSIX 사양은ed 다음과 같이 말합니다.

SIGINT

ed유틸리티는 캐릭터 작성 현재의 활성을 방해한다 ?\n표준 출력을하고 (확장 DESCRIPTION 절 참조) 명령 모드로 돌아 간다.

SIGHUP

버퍼가 비어 있지 않고 마지막 쓰기 이후에 변경된 경우, ed유틸리티는 버퍼 사본을 파일에 쓰려고 시도합니다. 먼저, ed.hup현재 디렉토리에 이름이 지정된 파일 이 사용됩니다. 이것이 실패하면, 환경 변수에 ed.hup의해 명명 된 디렉토리에 명명 된 파일 HOME이 사용되어야한다. 어쨌든 ed유틸리티는 파일을 현재 기억 된 경로 이름에 쓰지 않고 명령 모드로 돌아 가지 않고 종료됩니다.

SIGQUIT

ed유틸리티는이 이벤트를 무시하여야한다.

따라서 어떤 구현을 ed사용 하든 INT신호 ( Ctrl+C전송하는 것) 와 관련하여 POSIX 사양을 준수합니다 .

이와 관련하여 편집기는 대화식 셸처럼 동작하며 INT신호 수신시 종료되지 않습니다 . 기타 등의 편집자, vi그리고 nano같은 일을한다.


1
일부 프로그램 구현은 의도적으로 POSIX와 모순되므로 표준에 대한 이론적 근거 /이 경우 표준을 깨는 비용을 설명하는 것이 유용 할 수 있습니다. stackoverflow.com/questions/38605463/…
sourcejedi

1
@sourcejedi 표준은 그 이론적 근거에서 신호에 대해 아무 말도하지 않습니다. 나는 내가 이용할 수 있는 출처에서 왜 표준을 따르는 지에 대한 이론적 근거를 찾지 못했다 ed. 쉘과 유사한 방식으로 작동하며 INT신호 수신시 종료되지 않습니다 .
Kusalananda
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.