sudo
X端末エミュレータのフォアグラウンドプロセスが実際に.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をSINGINT
sudoに送信すると言いますが、私の考えでは、次のようなことは起こりませんkill(2)
。
プロセスがシグナルを送信する権限を持つには、許可が必要です(LinuxではCAP_KILL機能が必要です)。あるいは、転送プロセスの実際のまたは有効なユーザーIDは、宛先の実際のまたは保存されたセットのユーザーIDと同じでなければなりません。プロセス。 SIGCONTの場合、送信プロセスと受信プロセスが同じセッションに属していれば十分です。 (歴史的にルールは異なりました。注意事項を参照してください。)
ETX
私はこれがASCII(3)を使用していくつかのエスケープシーケンスを疑似端末に送信することに関連していると思いますが、まだ理解していません。 (信号がカーネルで発生するのはなぜですか?)
関連していますが、あいまいまたは不正確です。
私が最も興味を持っているのは、Linuxで動作する方法です。
答え1
(これは質問を明確にし、答える試みですが、改善と修正を歓迎します。)
sudo
まず、&
+ - はfg
ステーションに影響を与えないので、シーンから削除してみましょう(PIDを取得するために主に使用すると仮定します)。その後、質問は次のようになります。 1) 端末のフォアグラウンドで実行中のプロセスが SIGINT をどのように受け取りますか。 2)端末がX11(Xtermなど)を使用する疑似端末の場合はどうなりますか?
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次に、擬似端末をミックスに追加します。疑似ターミナルカーネルコードはまだ標準のターミナルコード(上記のように)を使用しています。したがって、PTY(Xターミナル)の「メイン」側が「CTRL」のX11キー押下イベントを受信すると、-CはスレーブPTYに送信され、カーネルターミナルドライバによって文字が検出され、SIGINTがフォアグラウンドプロセスグループ(あなたの場合はsudo)に送信されます。
APUE2 ページ 706 には、マスター PTY から信号を直接使用できることを示す短い「信号生成」段落がありますioctl(2)
(例:http://lingrok.org/xref/linux-linus/drivers/tty/pty.c#482)、しかしここではそうではないと思います。
コメントを歓迎します。