11

疑似端末で実行される子プロセスがあります。親プロセスは root として実行されませんが、子プロセスは su または sudo を介して実行されます。このため、子プロセスにシグナルを送信して強制的に終了させることはできません。次のいずれかの方法で強制的に終了させたい:

  • Ctrl-C をエミュレートします。
  • 端末のハングアップをエミュレートします。

これらのいずれかを行うにはどうすればよいですか? 私はすでに pty master fd を持っており、次のようなことを試しました:

write(master, &termios.c_cc[VINTR], 1)

しかし、それは何もしません。

4

6 に答える 6

2

私は最終的に次の解決策を採用しました:

分岐後、すぐに sudo を実行する代わりに、代わりにヘルパー子プロセスを exec() します。これにより、sudo が分岐および実行され、waitpid が呼び出されます。したがって、プロセス階層は次のようになります。

original process          <---- runs as user
  |
  +-- helper process      <---- runs as user, session leader,
         |                      has own pty, in pty's foreground process group
         |
         +--- sudo        <---- runs as root

ヘルパー プロセスを強制終了すると、pty にはフォアグラウンド プロセスがなくなります。これにより、OS はユーザーに関係なくフォアグラウンド プロセス グループ全体に SIGHUP を送信するため、sudo も SIGHUP されます。

于 2010-02-10T09:58:30.940 に答える
0

最初にチェックするのは、スレーブ側の制御端末にする必要があるかどうかです。これは私が覚えているよりも複雑で、デフォルトでは ptys が制御されない可能性があります。そのリンクは Linux 用です。他のシステムは、SysV と BSD 性に応じてどちらか一方を実行する必要がありますが、TIOCSCTTY を試してみるのがよいでしょう。

次に、termios で ISIG を設定しているかどうかを確認します。そうでない場合、VINTR と VQUIT は機能しません。

もちろん、反対側が SIGINT と SIGQUIT をキャッチしている場合は、別の問題が発生します。

于 2010-02-04T22:45:13.057 に答える
0

これを実現するには、次の 2 つの方法があります。

  • 子プロセスから、SIGCHLD シグナルをトラップして処理します。_exit(0) で子プロセスを終了できます。
  • ptreeというプログラムがあります。このようにすると、これをごまかすことができます...疑似コードで:
親の pid を取得します。
_popen("ptree %d", parent_pid) を使用
子プロセスのエントリごとに
システム ("kill -1 %d", child_process_pid)

頭に浮かぶのは2つです...それがさらに役に立たない場合は申し訳ありませんが、

これがお役に立てば幸いです。よろしくお願いします、トム。

于 2010-02-03T22:36:48.867 に答える
0

マスターを閉じると、スレーブの制御プロセス グループにハングアップが通知されます。

于 2010-02-03T22:43:25.723 に答える
0

ioctlの代わりに割り込み文字を挿入するには、を使用する必要があると思いますwrite。残念ながら、このメカニズムは移植可能ではないようです。Linuxの場合、これはうまくいくようです:

ioctl(master, TIOCSTI, &termios.c_cc[VINTR]);
于 2010-02-03T23:04:30.800 に答える