我有一个最小的 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 运行时始终如此),因此打开设备失败。
你的系统是也最小。您需要运行一个程序来设置控制终端,初始化适当的会话,并可能执行一些最基本的系统管理操作,例如正确且干净地关闭,然后运行作业控制 shell。
进一步阅读
- 艾伦·考克斯(2009-04-06)。Linux 分配的设备。 2.6+。 kernel.org。
答案2
看sh:cannot setterminal process group (-1) inproperty ioctl for device 错误是什么意思?有关此错误的详细信息。正如前面提到的,您的环境设置不正确。为了使作业控制(前台和后台进程处理)正常工作,您的环境需要正确设置调用进程 ID、进程组 ID 和会话 ID。另外,你的进程必须有一个tty,而且它必须是一个控制终端。
您收到的错误表明您的进程ID、进程组ID和会话ID是正确的;因为你得到的错误。但是,您的 shell 不是控制终端,因此会出现“-1”错误。
要将 tty 设置为控制终端,可以ioctl(your_fd, TIOCSCTTY,0)
在程序中使用 C API 调用来执行此操作。