![프로세스는 신호 + 터미널/셸 개념을 무시합니다.](https://linux55.com/image/163231/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EB%8A%94%20%EC%8B%A0%ED%98%B8%20%2B%20%ED%84%B0%EB%AF%B8%EB%84%90%2F%EC%85%B8%20%EA%B0%9C%EB%85%90%EC%9D%84%20%EB%AC%B4%EC%8B%9C%ED%95%A9%EB%8B%88%EB%8B%A4..png)
저는 리눅스 커널 4.1.8 32비트를 사용하고 있습니다.
내 init 프로세스(/etc/inittab 및 /etc/rd5.d 스크립트 사용)는 시작 시 "Hello" 프로세스를 실행합니다.
int main(){
int val;
printf("Hello\n");
scanf("%d",val);
return 0;
}
(리눅스, 신호, I/O를 사용하는 데 필요한 모든 것이 포함되어 있습니다...)
내 질문은 실용적이면서도 개념적입니다.
실제:
- 이 프로세스는 init 스크립트를 통해 실행될 때와 로그인 프로세스 전에만 ctrl z/x/c 신호를 무시합니다. 로그인 쉘 후에 실행하면 모든 것이 잘 작동합니다. 또한 "ps -eo pid,lstart,cmd" 명령을 실행하기 위해 몇 가지 코드를 추가했는데 초기화 실행 중에 셸 프로세스가 존재하지 않는 것을 발견했습니다.
개념:
처음에는 쉘이 프로세스에 신호를 보내는 역할을 담당한다고 생각했습니다. 다른 게시물을 읽으면서 이것이 잘못되었으며 책임이 있는 것은 터미널 콘솔이라는 것을 이해합니다. 문제는 터미널 콘솔이 프로세스가 아니라는 것입니다. 일종의 CLI "GUI"일 뿐입니다. 내 말은, 터미널이 없는 쉘은 사용자가 알지 못하는 사이에 스크립트를 실행하고 실행할 수 있는 반면, 쉘이 없는 터미널은 아무것도 할 수 없다는 것입니다... 아마도 프롬프트나 다른 것을 표시하는 것뿐일까요? 그러나 입력이 명령이나 인터럽트와 같은 어떤 방식으로든 영향을 미치려면 입력을 읽고 해석하는 쉘이 필요합니다. 응?
내가 여기서 무엇을 놓치고 있는 걸까요? 내 프로세스가 이러한 신호를 무시하는 이유가 로그인 프로세스 전과 대화형 셸이 열리기 전에 실행된다는 사실과 아무 관련이 없다면 그 이유는 무엇일까요? (다시 말하지만, init 스크립트의 일부가 아닌 쉘이 열린 후에 이것을 실행하면 모든 것이 잘 작동합니다)
이 주제를 설명하는 문헌이 있습니까?
편집하다:
/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 스크립트를 우리에게 게시하는 것이 좋습니다.
도움이 되었기를 바랍니다.