プロセスはシグナル+ターミナル/シェルの概念を無視します。

プロセスはシグナル+ターミナル/シェルの概念を無視します。

私はLinuxカーネル4.1.8 32ビットを使用しています。

私のinitプロセス(/etc/inittabおよび/etc/rd5.dスクリプトを使用)は、起動時に「Hello」プロセスを実行します。

int main(){
     int val;
     printf("Hello\n");
     scanf("%d",val);
     return 0;
}

(Linux、シグナル、I / Oを使用するために必要なすべてが含まれています...)

私の質問は実用的で概念的です。

実際:

  1. このプロセスは、initスクリプトを介して実行されたときとログインプロセスの前にのみctrl z / x / c信号を無視します。ログインシェルの後に実行すると、すべてがうまく機能します。また、「ps -eo pid、lstart、cmd」コマンドを実行するためにいくつかのコードを追加しましたが、初期化の実行中にシェルプロセスが存在しないことがわかりました。

コンセプト:

  1. 最初は、シェルがプロセスにシグナルを送る役割を担うと思いました。他の投稿を読んで、これが間違っていて責任があるのは端末コンソールであることを理解しています。問題は、ターミナルコンソールがプロセスではないことです。一種のCLI「GUI」だけです。私は、端末のないシェルはユーザーが知らない間にスクリプトを実行して実行できますが、シェルのない端末は何もできないということです。ただし、入力がコマンドや割り込みなど、何らかの方法で影響を与えるには、入力を読み取って解釈するシェルが必要です。うん?

  2. 私がここで何を見逃しているのでしょうか?私のプロセスがこれらのシグナルを無視する理由がログインプロセスの前とインタラクティブシェルが開かれる前に実行されるという事実とは何の関係もない場合、その理由は何ですか? (再び、initスクリプトの一部ではなく、シェルが開いた後にこれを実行すると、すべてがうまくいきます)

  3. このトピックを説明する文献はありますか?

編集する:

/etc/inittab:

# /etc/inittab: init(8) configuration.
# $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $
# The default runlevel.
id:5:initdefault:
# Boot-time system configuration/initialization script.
# This is run first except when booting in emergency (-b) mode.
si::sysinit:/etc/init.d/rcS
# What to do in single-user mode.
~~:S:wait:/sbin/sulogin
# /etc/init.d executes the S and K scripts upon change
# of runlevel.
#
# Runlevel 0 is halt.
# Runlevel 1 is single-user.
# Runlevels 2-5 are multi-user.
# Runlevel 6 is reboot.
l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
# Normally not reached, but fallthrough in case of emergency.
z6:6:respawn:/sbin/sulogin
S0:12345:respawn:/sbin/getty -L 115200 ttyS0

/etc/init.d/rcSフォルダのスクリプト:

# source function library
. /etc/init.d/functions
        echo "Starting gripen applications"
    cd /appsys/bin
    /bin/sh -c ./testApp
    echo "done."

ベストアンサー1

投稿された情報はあなたの具体的な状況を知らないので、まずあなたの概念的な混乱について答えます。

コマンドを発行または中断するには、入力を読み取って解釈するシェルが必要です。うん?

不要。キーボードから生成された信号(Ctrl-Cなど)を渡すためにシェルは必要ありません。キーボードから生成された信号を受信します。 -

  • あなたのプロセスはフォアグラウンドプロセス;

  • あなたのプロセスに制御端子

実行中のフォアグラウンドプロセスは端末をブロックし、端末から現在の入力を受け取ります。

通常、ログインプロセスは getty コマンドによって開始され、ログインシェルによって実行されるプロセスは getty で指定された端末を制御端末として使用します。ログインする前に、初期初期化プロセスはデフォルトでカーネルコンソール端末を制御端末として使用していました。

APUE第3版第9章では、これについてもっと学ぶことができます。

あなたのケースに戻って、通常/etc/rc?.dのプログラムはカーネルコンソール端末からキーボード生成信号を受け取ることができます。プログラムがどのように起動するかを確認するには、initスクリプトを私たちに公開することをお勧めします。

お役に立てば幸いです。

おすすめ記事