假设一个简单的程序,如下:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int fd = -1;
if (access("/dev/tty", F_OK) == 0)
{
fd = open("/dev/tty", O_RDWR);
if (fd == -1)
perror("open() :");
}
return 0;
}
编译并使其成为init(内核调用的第一个进程),然后重新启动,但会得到结果:
open() :No such device or address
这怎么解释呢?
答案1
/dev/tty
是对进程控制终端的引用。但为了让它有一个控制终端,必须打开一个真实的终端并将其分配给该进程。
也许您应该打开 /dev/tty0 或 /dev/console 或 /dev/tty1 而不是打开 /dev/tty
如果一个进程没有控制终端,并且它打开一个 tty 或 pty,如果没有其他东西正在使用该 tty 作为控制终端,则该进程将被分配该 tty 作为控制终端。如果条件正确,也可以打开一个 tty 并将其指定为具有 IOCTL 的控制终端。
但是 /dev/tty 不是真正的 tty,因此这些条件不适用于它。
答案2
@user110489 的回答对我有用。
您要做的是将 替换/dev/tty
为/dev/console
。
我的系统配置:
OS - windows 10
IDE - VSCode
Error arrise in - husky hooks.