나는 최소한의 Linux 시스템을 가지고 있습니다.
init /bin/bash
, 최소한의 라이브러리만 정적으로 채워지고 /lib/
데몬 /dev/
이 실행되지 않습니다(udev, .. 없음).
Bash가 시작되면 다음 오류가 발생합니다.
bash: cannot set terminal process group (-1) inappropriate ioctl for device
bash: no job control in this shell
strace를 사용하여 bash를 시작하면 다음과 같은 출력이 표시됩니다.
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
open("/dev/tty", O_RDWR|O_NONBLOCK) = -1 ENXIO (No such device or address)
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
....
readlink("/proc/self/fd/0", "/dev/console"..., 4095) = 12
stat("/dev/console", {st_mode=S_IFCHR|0600, st_rdev=makedev(5, 1), ...}) = 0
open("/dev/console", O_RDWR|O_NONBLOCK) = 3
Bash를 열 수 없는 것 같습니다 /dev/tty
. 그러나 /dev/tty
존재 /dev/
하며 올바른 권한이 있습니다.
ll /dev/tty*
crw-rw-rwT 1 root root 5, 0 2014-Sep-29 23:39:47 dev/tty
crw------T 1 root root 4, 0 2015-Dec-23 20:10:18 dev/tty0
crw------T 1 root root 4, 1 2015-Dec-23 20:10:18 dev/tty1
왜 bash
열 수 없나요 /dev/tty
? 이 오류는 무엇을 ENXIO
의미합니까?
답변1
초기화는
/bin/bash
내가 말했듯이https://unix.stackexchange.com/a/197472/5132, init=/bin/sh
"API" 파일 시스템이 마운트되지 않고 유형 exit
(https://unix.stackexchange.com/a/195978/5132), 일반적으로 시스템을 최소한으로 사용 가능하게 만드는 작업을 수동으로 수행하는 것은 (수퍼) 사용자에게 맡겨집니다.
이러한 작업 중 하나(분명히 작업 제어 셸을 사용하려는 경우)는 다음과 같습니다.제어 터미널 가져오기. /dev/tty
실제 단말 장치가 아닙니다. 열려 있는 프로세스의 제어 터미널로 리디렉션하는 장치입니다. 그 경우아니요, 프로세스 #1이 시작되지 않았기 때문에 장치를 여는 데 실패했습니다(실제 시스템 관리자 프로그램이 프로세스 #1로 실행 중일 때 항상 발생함).
당신의 시스템은또한최저한의. 제어 터미널을 설정하고, 적절한 세션을 초기화하고, 적절하고 완전한 종료와 같은 가장 기본적인 시스템 관리 작업 중 일부를 수행한 다음 작업 제어 셸을 실행하는 프로그램을 실행해야 합니다.
추가 읽기
- 앨런 콕스(2009-04-06).Linux 할당 장치. 2.6+. kernel.org.
답변2
바라보다장치 오류에 대한 sh:cannot setterminal 프로세스 그룹(-1) 속성 ioctl은 무엇을 의미합니까?이 오류에 대한 추가 정보. 앞서 언급했듯이 환경이 올바르게 설정되지 않았습니다. 작업 제어(포그라운드 및 백그라운드 프로세스 처리)가 제대로 작동하려면 환경에서 호출 프로세스 ID, 프로세스 그룹 ID 및 세션 ID가 올바르게 설정되어야 합니다. 또한 프로세스에는 tty가 있어야 하며 제어 터미널이어야 합니다.
발생한 오류는 발생한 오류로 인해 프로세스 ID, 프로세스 그룹 ID 및 세션 ID가 정확함을 나타냅니다. 그러나 쉘이 제어 터미널이 아니므로 "-1" 오류가 발생합니다.
tty를 제어 터미널로 설정하려면 ioctl(your_fd, TIOCSCTTY,0)
C API 호출을 사용하여 프로그램에서 이를 수행할 수 있습니다.