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

中断する前に別の端末で起動しましたsudostrace

# 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 または疑似端末に関係なく発生します。 「UNIX環境第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 ページ 706 には、マスター PTY から信号を直接使用できることを示す短い「信号生成」段落がありますioctl(2)(例:http://lingrok.org/xref/linux-linus/drivers/tty/pty.c#482)、しかしここではそうではないと思います。

コメントを歓迎します。

おすすめ記事