/dev目录中的项目到底是什么?

我一直在用C++编写一个应用程序,通过向连接到串口的调制解调器写入数据来传输无线电消息。为了做到这一点,我需要使用以下形式的代码获取文件描述符:
fd1=open(“/dev/ttyS0″, O_RDWR | O_NOCTTY | O_NDELAY);

这让我对/dev中的项目性质产生了好奇。为了尝试了解这些项目的内容,我尝试了一个
sudo cat /dev/ttyS0

只为了获得信息
cat: /dev/ttyS0: Input/output error

这并没有帮助我理解。这些项目到底是一个文件还是一种链接,允许访问驱动程序功能呢?
2个回答

在Linux中,一切都是文件或目录。位于/dev的东西是特殊文件。
大多数设备要么是块设备,要么是字符设备;然而还存在其他类型的设备,并且可以创建。一般来说,“块设备”是存储或保存数据的设备,“字符设备”可以被视为传输或传送数据的设备。例如,软盘驱动器、硬盘驱动器和CD-ROM驱动器都是块设备,而串口、鼠标和并行打印机端口都是字符设备。虽然有一种命名方案,但在绝大多数情况下,这些命名完全不合逻辑。
设备通过类型(如“块”或“字符”)以及“主”和“次”号来定义。主号用于对设备进行分类,次号用于识别特定的设备类型。例如,连接到主控制器的所有IDE设备具有主号3。主从设备以及各个分区通过使用次号进一步定义。
摘自Linux-Filesystem-Hierarchy

2个选项:

  • 尝试执行以下命令并查看是否有效:cat < /dev/ttyS0
  • 你可以通过将用户添加到相同的组(例如dialout)来解决这个错误。

  • “字符设备”可以被视为传输或传递数据的设备。这也是为什么你会得到这样的结果:crw-rw---- 1 root dialout 4, 64 Feb 2 15:34 ttyS0。我猜“c”代表字符。 - JohnMerlino

    The Linux Documentation Project中:
    计算机将每个串口视为一个“设备”。它有时被称为终端设备,因为在过去终端是串口最常见的用途。对于每个串口,在/dev(设备)目录下都有一个特殊文件。/dev/ttyS0是DOS/Windows世界中称为COM1的串口的特殊文件。
    要将文本发送到终端,您可以将某个命令行命令的标准输出重定向到相应的特殊文件。例如,在命令提示符处键入“echo test > /dev/ttyS1”应该将单词“test”发送到ttyS1(COM2)上的终端,前提是您对/dev/ttyS1具有写权限。类似地,键入“cat my_file > /dev/ttyS0”将会将文件my_file的内容发送到COM1(ttyS0)。