4

来自linux的人如何制作/dev文件。您可以写信给它们,它们会立即被删除。我可以想象一些程序不断读取一些开发文件:

FILE *fp;
char buffer[255];
int result;
fp = fopen(fileName, "r");
if (!fp) {
    printf("Open file error");
    return;
}
while (1)
{

    result = fscanf(fp, "%254c", buffer);
    printf("%s", buffer);
    memset(buffer, 0, 255);
    fflush(stdout);
    sleep(1);
}
fclose(fp);

但是如何删除那里的内容?关闭文件并以“w”模式再次打开它们不是他们这样做的方式,因为你可以这样做cat > /dev/tty

4

4 回答 4

8

什么是文件?文件是目录结构中表示对象的名称。当您打开类似 的文件/home/joe/foo.txt时,操作系统会在内存中创建一个表示该文件的对象(或找到一个现有的对象,如果该文件已打开),将一个描述符绑定到它,然后返回该描述符,然后对该文件描述符进行操作(如readwrite) 通过对象被定向到文件系统代码中,该代码操作文件在磁盘上的表示。

设备条目也是目录结构中的名称。当您打开 some/dev/foo时,操作系统会在内存中创建一个表示设备的对象,或者找到一个现有的对象(在这种情况下,如果设备不支持多次打开,则可能会出错!)。如果成功,它会将一个新的文件描述符绑定到设备对象并将该描述符返回给您的程序。该对象的配置方式是,描述符上的read和之类的操作write被定向为调用 device 的特定设备驱动程序foo,并对应于对该设备执行某种 I/O。

中的此类条目/dev/不是文件;它们的一个更好的名称是“设备节点”(一个理由是mknod命令的名称)。只有当程序员和系统管理员说话非常松散时,他们才会称它们为“设备文件”。

当你这样做cat > /dev/tty时,没有任何东西在“另一端”“擦除”数据。嗯,不完全是。基本上,cat调用write一个描述符,这会导致一个函数调用链,最终在内核的 tty 子系统的某个地方结束。数据被传递给 tty 驱动程序,该驱动程序将数据发送到串行端口或套接字,或发送到在屏幕上绘制字符或其他任何东西的控制台设备。虚拟终端就像xterm使用一对设备:一个主从伪终端。如果一个 tty 连接到一个伪 tty 设备,那么cat > /dev/tty写入会通过一种“长号”:它们在伪 tty 的主端冒泡,实际上while (1)在某些用户空间 C 程序中有一个循环接收字节,就像从管道中一样。xterm(管他呢); 它删除数据并在其窗口中绘制字符,滚动窗口等。

于 2013-11-09T00:33:26.683 回答
3

Unix 被设计成可以像访问其他所有设备(作为文件)一样访问设备(tty、打印机等),因此 /dev 中的文件是特殊的伪文件,代表文件系统中的设备。

您不想删除此类设备文件的内容,老实说,如果您在不了解自己在做什么的情况下随意写信给他们,这可能会对您的系统造成危险。

于 2013-11-08T23:33:04.337 回答
2

设备文件不是普通文件,如果“普通文件”指的是任意字节序列,通常存储在介质上。但并非所有文件都是普通文件。

更广泛地说,文件是指系统服务和/或资源的抽象,服务是您可以出于某种目的向其发送信息的东西(例如,对于普通文件,将数据写入存储),资源是您请求数据的东西from 出于某种目的(例如,对于普通文件,从存储中读取数据)。C 定义了与此类服务/资源接口的标准。

设备文件符合此定义,但它们不一定与我更具体的“普通文件”示例相匹配,即读写存储。您可以直接创建开发文件,但这样做的唯一有意义的原因是在内核模块的上下文中。更多时候您可能会引用它们(例如,使用 udev),请记住它们实际上是由内核创建的,并表示与内核的接口。除此之外,接口的功能因开发文件而异。

于 2013-11-08T23:42:33.503 回答
1

我还找到了很好的解释:

http://lwn.net/images/pdf/LDD3/ch18.pdf

于 2013-11-09T11:10:17.707 回答