xterm에서 Ctrl-C를 눌러 sudo를 중단하는 방법은 무엇입니까? [복사]

xterm에서 Ctrl-C를 눌러 sudo를 중단하는 방법은 무엇입니까? [복사]

sudoX 터미널 에뮬레이터의 포그라운드 프로세스가 실제로 .NET에서 어떻게 작동하는지 자세히 설명해주세요(tty 관련 내용 포함) Ctrl-C.

다음 예를 참조하세요.

$ sudo -u test_no_pw sleep 999 &                                    
[1] 16657                  
$ ps -o comm,pid,ppid,ruid,rgid,euid,egid,suid,sgid,sid,pgid -t
COMMAND           PID  PPID  RUID  RGID  EUID  EGID  SUID  SGID   SID  PGID
zsh             15254 15253  1000  1000  1000  1000  1000  1000 15254 15254
sudo            16657 15254     0  1000     0  1000     0  1000 15254 16657
sleep           16658 16657  1002  1002  1002  1002  1002  1002 15254 16657
ps              16660 15254  1000  1000  1000  1000  1000  1000 15254 16660
$ fg
[1]  + running    sudo -u test_no_pw sleep 999
^C
$ # it was killed

중단하기 전에 다른 터미널에서 시작했습니다 sudo.strace

# strace -p 16657
Process 16657 attached
restart_syscall(<... resuming interrupted call ...>) = ? ERESTART_RESTARTBLOCK (Interrupted by signal)
--- SIGINT {si_signo=SIGINT, si_code=SI_KERNEL, si_value={int=809122100, ptr=0x54552036303a3934}} ---
[...SNIP...]

그래서 발신자가 SI_KERNEL흥미 롭습니다. 어제 IRC 채널과 Google에 질문했지만 모호하거나 잘못된 답변만 받았습니다. 대부분의 사람들은 터미널이나 쉘이 sudo를 SINGINTsudo로 보낼 것이라고 말하지만 제 생각에는 다음과 같이 이런 일이 발생하지 않습니다 kill(2).

프로세스가 신호를 보낼 수 있는 권한을 가지려면 권한이 부여되어야 합니다(Linux에서는 CAP_KILL 기능이 있어야 함). 또는 전송 프로세스의 실제 또는 유효 사용자 ID는 대상의 실제 또는 저장된 세트 사용자 ID와 같아야 합니다. 프로세스. SIGCONT의 경우 송신 프로세스와 수신 프로세스가 동일한 세션에 속해 있으면 충분합니다. (역사적으로 규칙은 달랐습니다. 참고 사항을 참조하세요.)

ETX나는 이것이 ASCII(3)를 사용하여 일부 이스케이프 시퀀스를 의사 터미널로 보내는 것과 관련이 있다고 예상 하지만 아직 이해하지 못했습니다. (신호가 커널에서 발생하는 이유는 무엇입니까?)

관련이 있지만 모호하거나 부정확함:

제가 가장 관심을 갖는 것은 Linux에서 작동하는 방식입니다.

답변1

(이는 질문을 명확히 하고 답변하려는 시도이지만 개선과 수정을 환영합니다.)

sudo먼저 및 &+ -는 fg스테이션에 영향을 주지 않으므로 장면에서 제거해 보겠습니다(PID를 얻기 위해 주로 사용한다고 가정합니다). 그러면 질문은 다음과 같습니다. 1) 터미널의 포그라운드에서 실행 중인 프로세스가 SIGINT를 어떻게 수신합니까? 2) 터미널이 X11(예: Xterm)을 사용하는 의사 터미널인 경우 어떻게 됩니까?

  1. SIGINT(및 SIGQUIT, SIGTSTP) 전달은 커널 제어 터미널 드라이버가 CTRL-C 문자를 가로챌 때 생성되므로 SI_KERNEL이를 소스로 간주합니다. 이는 X11 또는 의사 터미널에 관계없이 발생합니다. "유닉스 환경 제2판(APUE2)의 고급 프로그래밍", 그림 9.7, 272페이지에 이에 대한 좋은 설명이 있습니다(저작권상의 이유로 여기에 붙여넣지는 않겠지만 찾을 수 있을 것이라고 확신합니다). 이에 대한 자세한 내용은 275페이지의 "9.8 작업 제어" 섹션에 설명되어 있습니다. 관련 Linux 커널 코드는 아마도 다음과 같습니다: http://lingrok.org/xref/linux-linus/drivers/tty/n_tty.c#1254

  2. 이제 의사 터미널을 믹스에 추가합니다. 의사 터미널 커널 코드는 여전히 표준 터미널 코드(위에서 언급한 대로)를 사용합니다. 따라서 PTY(X 터미널)의 "주" 측이 "CTRL"의 X11 키 누르기 이벤트를 수신하면 -C", 이는 슬레이브 PTY로 전송되고, 커널 터미널 드라이버에 의해 문자가 감지되고 SIGINT가 포그라운드 프로세스 그룹(귀하의 경우 sudo)로 전송됩니다. APUE2의 676페이지에 있는 그림 19.1에 이에 대한 설명이 나와 있습니다.

APUE2 페이지 706에는 마스터 PTY에서 신호를 직접 사용할 수 있음을 언급하는 짧은 "신호 생성" 단락이 있습니다 ioctl(2)(예:http://lingrok.org/xref/linux-linus/drivers/tty/pty.c#482), 하지만 여기서는 그렇지 않다고 생각합니다.

의견을 환영합니다.

관련 정보