dev文件如何工作?

时间:2013-11-08 22:47:42

标签: linux file c udev

来自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 个答案:

答案 0 :(得分:8)

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

设备条目也是目录结构中的名称。当您打开一些/dev/foo时,操作系统会创建一个表示设备的内存中对象,或者找到一个现有对象(如果该设备不支持多次打开,则可能会出现错误!)。如果成功,它会将新文件描述符绑定到设备obejct并将该描述符返回给您的程序。对象的配置方式使得描述符上的readwrite等操作可以调用设备foo的特定设备驱动程序,并对应于某种类型的设备使用该设备的I / O.

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

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

答案 1 :(得分:3)

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

你不想删除这样一个设备文件的内容,老实说,如果你不知道自己在做什么而不知道自己在做什么,那么你的系统可能会有危险。

答案 2 :(得分:2)

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

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

设备文件符合此定义,但它们不一定与我在存储中读取和写入的更具体的“普通文件”示例相匹配。您可以直接创建dev文件,但这样做的唯一有意义的原因是在内核模块的上下文中。更常见的是你可以引用它们(例如,使用udev),记住它们实际上是由内核创建的,并代表与内核的接口。除此之外,界面的功能从开发文件到开发文件不同。

答案 3 :(得分:1)

我也找到了很好的解释:

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