如何从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);
但如何删除那里的内容? closures一个文件并以“w”模式再次打开它们并不是他们如何完成的,因为你可以这样做,即cat > /dev/tty
什么是文件? 文件是表示对象的目录结构中的名称。 当你打开一个像/home/joe/foo.txt
这样的文件时,操作系统会在内存中创建一个代表该文件的对象(或者如果该文件已经打开,则找到一个已有的对象),将一个描述符绑定到返回的那么对该文件描述符的操作(如write
)通过对象被引导到文件系统代码中,该文件系统代码操作文件在磁盘上的表示。
设备条目也是目录结构中的名称。 当你打开一些/dev/foo
,操作系统会创建一个表示设备的内存对象,或者找到一个现有的对象(在这种情况下,如果设备不支持多次打开的话,可能会出错)。 如果成功,它会将新的文件描述符绑定到设备obejct,并将该描述符返回到您的程序。 该对象被配置为使得描述符上的诸如read
的操作被定向为调用到用于设备foo
的特定设备驱动程序,并且对应于与该设备进行某种I / O。
/dev/
中的这些条目不是文件; 对他们来说更好的名字是“设备节点”(其中的理由是mknod
命令的名称)。 只有程序员和系统管理员说得非常松散,他们才称之为“设备文件”。
当你执行cat > /dev/tty
,没有任何东西在“擦除”另一端的数据。 那么,不完全是。 基本上, cat
正在调用write
描述符,这导致了一系列的函数调用,最终在内核的tty子系统的某处。 数据被交给一个tty驱动,它将数据发送到一个串口,或者插口,或者一个控制台设备,在屏幕上绘制字符等等。 像xterm
这样的虚拟终端使用一对设备:一个主设备和一个从设备。 如果一个tty连接到一个伪tty设备,那么cat > /dev/tty
写入的是一种“长号”:它们在伪tty的主端上冒泡,实际上有一段while (1)
在一些接收字节的用户空间C程序中循环,如从一个管道。 该程序是xterm
(或其他); 它删除数据并在其窗口中绘制字符,滚动窗口等。
Unix的设计使设备(tty,打印机等)像所有其他东西(作为文件)一样被访问,所以/ dev中的文件是代表文件系统内设备的特殊伪文件。
你不想删除这样的设备文件的内容,并且诚实地说,如果你不知道自己在做什么,就会写信给你的系统,这对你的系统可能是危险的。
设备文件不是普通文件,如果“普通文件”是指通常存储在介质上的任意字节序列。 但不是所有的文件都是正常的文件。
更广泛地说,文件是一个涉及系统服务和/或资源的抽象 ,服务是为了某种目的而发送信息的一种服务(例如,对于普通文件,将数据写入存储)以及资源是您请求数据出于某种目的(例如,用于正常文件,从存储读取数据)。 C定义了一个与这种服务/资源接口的标准。
设备文件符合这个定义,但它们并不一定匹配我更具体的“正常文件”读写存储的例子。 您可以直接创建开发文件,但唯一有意义的原因是在内核模块的上下文中。 更多的时候你可以参考它们(例如,用udev),记住它们实际上是由内核创建的,代表了与内核的接口。 除此之外,接口的功能不同于开发文件到开发文件。
我也发现了一个很好的解释: