我使用的是 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...所需的所有内容)
我的问题既是实践的也是概念的:
实际的:
- 仅当通过 init 脚本执行并且在登录过程之前,此过程才会忽略 ctrl z/x/c 信号。如果我在登录 shell 后运行它 - 一切正常。此外,我向其中添加了一些代码来运行:“ps -eo pid,lstart,cmd”命令,我发现在初始化时执行期间不存在 shell 进程。
概念:
起初我以为 shell 是负责向进程发送信号的。通过阅读其他帖子,我了解到这是不正确的,负责的是终端控制台。问题是终端控制台不是一个进程。它只是某种 CLI“GUI”。我的意思是,没有终端的 shell 可以在用户不知情的情况下运行和执行脚本,而没有 shell 的终端什么也做不了……也许只显示提示符或其他内容?但为了让我们的输入以某种方式产生影响——命令或中断,我们需要一个 shell 来读取和解释我们的输入。是吗?
我在这里缺少什么?如果我的进程忽略这些信号的原因与它在登录进程之前和交互式 shell 打开之前执行的事实无关,那么它可能是什么? (同样,如果我在 shell 打开后运行它而不是初始化脚本的一部分,那么一切正常)
有没有文献解释这个主题?
编辑:
/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
从你发布的信息中我不知道你的具体情况,所以我先回答一下你的一些概念上的困惑。
命令或中断我们需要一个 shell 来读取和解释我们的输入。是吗?
不需要。传递键盘生成的信号(如 Ctrl-C)不需要 shell。接收键盘生成的信号 -
你的流程需要是前台进程;
你的流程需要有一个控制终端。
正在运行的前台进程将阻塞其终端并从终端获取当前输入。
通常,登录进程是由 getty 命令启动的,登录 shell 运行的进程将 getty 指定的终端作为其控制终端。在登录之前,早期的 init 进程默认将内核控制台终端作为其控制终端。
您可以在 APUE 第 3 版第 9 章中了解更多相关信息。
回到你的情况,通常情况下,/etc/rc?.d 中的程序能够从内核控制台终端接收键盘生成的信号。我建议您将您的初始化脚本发布给我们,以查看您的程序是如何启动的。
希望这可以帮助。