참조를 사용하여 종료할 수 없는 이유는 무엇입니까?

참조를 사용하여 종료할 수 없는 이유는 무엇입니까?

ed이 프로그램은 -send break를 사용하여 종료할 수 없지만 대신 콘솔에 오류 메시지 "?"를 인쇄 하는 최소 텍스트 편집기입니다 . 인터럽트를 받은 후 바로 종료하지 않는 이유는 무엇입니까? 물론 여기서는 종료하는 것보다 비밀스러운 오류 메시지가 더 유용할 이유가 없습니다. 이 동작으로 인해 많은 신규 사용자가 다음과 같은 상호 작용을 하게 됩니다.CtrlCed

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

이 비극적인 낭비는 단순히 ed중단에 동의함으로써 쉽게 피할 수 있습니다.

유사한 동작을 보이는 또 다른 완고한 프로그램도 less무시할 이유가 별로 없는 것 같습니다 C-c. 왜 이러한 프로그램은 프롬프트만 받아들이지 않습니까?

답변1

Ctrl+ C보내기지능을 신호하다. SIGINT의 일반적인 작동은 프로그램의 최상위 루프로 돌아가서 현재 명령을 취소하고 프로그램이 다음 명령을 기다리는 모드로 들어가는 것입니다. 비대화형 프로그램만 SIGINT로 종료됩니다.

따라서 Ctrl+는 자연스럽게 Ced를 종료하지 않고 최상위 루프로 돌아가게 합니다. Ctrl+ C현재 입력 라인을 중단하고 ed 프롬프트로 돌아갑니다.

더 적은 경우에도 마찬가지입니다. Ctrl+ C현재 명령을 중단하고 명령 프롬프트로 돌아갑니다.

역사적인 이유로 ed는 무시합니다.신호 출구( Ctrl+ \). 일반 애플리케이션은 활성화된 경우 코어 덤프를 사용하여 이 신호를 포착하고 자체적으로 종료되도록 허용해서는 안 됩니다.

답변2

이것유닉스 V7 ed(1)소스 코드는 몇 개의 주석만 포함된 원시 1,762줄 C 프로그램입니다. 그 중 하나는 다음과 같은 헤더 주석입니다.

/*
 * Editor
 */

소스 코드 자체는 어떠한 근거도 제공하지 않으므로 프로그램 작성자에게서만 얻을 수 있습니다.

ed원래는 다음과 같이 작성되었습니다.PDP-11 어셈블리에서 Ken Thompson 작성, 그러나 C로 포팅되었습니다.데니스 리치, Unix용 C를 만든 다음 이를 사용하여 Unix를 PDP가 아닌 시스템에 이식할 수 있도록 했습니다. 아쉽게도 Rich 박사는 더 이상 이러한 질문에 답하지 않습니다.

코드를 읽어보니 이 작업은 유지하기 위해 수행된 것 같습니다.코어 내에서편집된 문서의 사본입니다. 다른 텍스트 편집기도 작동하지 않는다는 것을 알 수 있습니다 Ctrl-C.

ed그 기능은 다음과 같습니다 Ctrl-C.

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

(예,캐리 C. 반환 유형 지정자나 매개변수 선언이 필요하지 않습니다. )

영어로 번역하다 ed:

  1. 신호 처리기를 다시 등록하십시오.

  2. 새 줄을 작성하고 전역 변수²를 통해 수행된다는 점을 기억하세요 lastc.

  3. error()함수를 호출하세요.뛰어나게?사용자의 관점에서 보면 인쇄 이상의 역할을 하지 않습니다.

즉, "당신은 정말로 이 일을 하고 싶지 않습니까?"라고 말하는 것입니다.


각주:

  1. Unix는 자동 재설정 신호를 수신하지 않습니다.4.3BSD까지, 1980년대 중반에 출시되었습니다. "다른 시스템과의 비교" 아래 첫 번째 항목을 참조하세요.

  2. ed.c대략 있습니다.육십전역변수!

답변3

ed다른 대화형 프로그램과 마찬가지로 Ctrl+를 사용하여 C프로그램 자체의 작업을 중단합니다.
이는 셸에서 실행 중인 작업(명령)을 중단하는 일반적인 상황과 매우 유사합니다.

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

쉘은 Ctrl+에서도 종료 C되지 않습니다 ed. 그리고 Ctrl+ 에서 종료 됩니다 D. 또, 마치ed

답변4

ed우려해야 할 세 가지 신호는 다음과 같습니다.

  1. INT
  2. HUP
  3. QUIT

POSIX 사양ed이에 대해 다음과 같이 말합니다.

SIGINT

유틸리티 ed는 현재 활동을 중단하고 표준 출력에 문자열을 쓴 ?\n다음 명령 모드로 돌아가야 합니다(확장 설명 섹션 참조).

SIGHUP

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

SIGQUIT

유틸리티는 ed이 이벤트를 무시해야 합니다.

따라서 어떤 구현을 사용하든 신호 ed에 대한 POSIX 사양 (즉, 전송되는 내용)을 준수합니다.INTCtrl+C

이런 점에서 편집기는 대화형 셸처럼 작동하며 신호를 수신해도 종료되지 않습니다 INT. 및 같은 다른 편집자 vinano동일한 작업을 수행합니다.

관련 정보