进一步阅读

进一步阅读

我有一个最小的 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/5132init=/bin/sh没有安装“API”文件系统,以一种笨拙的方式崩溃,当一个类型exithttps://unix.stackexchange.com/a/195978/5132),并且通常将其留给(超级)用户手动执行使系统最低限度可用的操作。

这些操作之一(如果您想使用作业控制外壳,正如您显然所做的那样)是获取控制终端/dev/tty不是实际的终端设备。它是一个重定向到任何打开进程的控制终端的设备。如果它没有,因为进程 #1 不开始(并且通常在真正的系统管理器程序作为进程 #1 运行时始终如此),因此打开设备失败。

你的系统是最小。您需要运行一个程序来设置控制终端,初始化适当的会话,并可能执行一些最基本的系统管理操作,例如正确且干净地关闭,然后运行作业控制 shell。

进一步阅读

答案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 调用来执行此操作。

相关内容