在 Linux 中,一切(或几乎一切)都是文件。
文件和设备
硬件设备在 Linux 操作系统中通常被映射为文件。可以使用 mount 命令加载 CD-ROM 、 Windows 下的文件系统或者其他的设备。
UNIX 和 Linux 中比较重要的设备文件有三个:
1. dev/console 该设备代表系统控制台,错误信息和诊断信息通常会被发送到这个设备上。在现代的工作站和 Linux 上,它通常是“活跃”的虚拟控制台;而在 X 窗口系统中,它会是屏幕上一个特殊的控制台窗口。
2. dev/tty 如果一个进程有控制终端的话,那么特殊文件 /dev/tty 就是这个控制终端(键盘、显示屏或者窗口)的别名(逻辑设备)。
注意 :虽然 /dev/console 设备只有一个,但通过 /dev/tty 却能够访问许多不同的物理设备。
3. /dev/null 这是空设备,所有写向该设备的输出都将被丢弃。
提示 :还有一个特殊设备 /dev/zero 经常被用到,它的作用是以内容为 null 字节的源文件来来创建零长度文件。它经常用在 dd 命令的 if 参数中。
扫描目录
与目录操作相关的函数在 dirent.h 头文件中声明。其中,目录的读写函数在《 UNIX 环境下 C 语言编程及项目实践》的 读书笔记 3 中有过介绍。除了 opendir 、 closedir 和 readdir 这三个常见的函数外,还有两个函数: telldir 和 seekdir 。
telldir 函数的返回值记录了一个目录流里的当前位置;接着,我们可以在随后的 seekdir 调用中利用这个值将目录指针重置到之前的位置。
在 Linux 系统上一个常见的问题就是对目录进行扫描,也就是确定一个特定目录下存放的文件。在上述提到的读书笔记中曾给出了一个扫描实例,但是该实例只是扫描了当前目录下的文件,并没有深入到子目录的层面。这里给出一个扫描当前目录下(包含子目录)所有文件的实例 printdir
/* * function: print all files and directories under 'dir' directory * paremeters: * dir [in] point to the directory needed to print * depth [in] width align to left, incrementing while nested */ void printdir(char *dir, int depth){ DIR *dp; struct dirent *entry; struct stat statbuf;
if((dp = opendir(dir)) == NULL){ fprintf(stderr, "Can't open direntory: %s/n", dir); return; } chdir(dir); while((entry = readdir(dp)) != NULL){ lstat(entry->d_name, &statbuf); if(S_ISDIR(statbuf.st_mode)){ if(strcmp(".", entry->d_name)==0 || strcmp("..", entry->d_name)==0) continue; printf("%*s%s//n", depth, "", entry->d_name); printdir(entry->d_name, depth+4); } else printf("%*s%s/n", depth, "", entry->d_name); } chdir(".."); closedir(dp); } |
提示 :为了在输出时对于不同层次的目录有缩进,这里使用了可变字段宽度 %*s 。其中 * 可以由一个整形值来指定,代表了在输出后面字符串时所要求的宽度。
/proc 文件系统
Linux 提供了一个特殊的文件系统 procfs ,它通常表现为 /proc 目录。该目录中包含了许多特殊文件以允许对驱动和内核信息进行高层访问。只要应用程序有正确的访问权限,它们就可以通过读写这些文件来获得信息或设置参数。
/proc 目录中的文件会随系统的不同而不同,当 Linux 版本中有更多的驱动和设施支持 procfs 文件系统时,该目录中就会包含更多的文件。不过,该目录下有许多东西是在任何 Linux 系统中都存在的。
大多情况下,只需要直接读取这些文件 就可以获取信息。比如 /proc/cpuinfo 、 /proc/meminfo 、 /proc/version 和 /proc/net/sockstat 就分别给出了 CPU 、内存、 Linux 版本和网络套接字的信息。
其实, /proc 目录下的有些文件不但可以读取,还可以修改。比如说,系统中所有运行的程序同时能够打开的文件总数是 Linux 内核的一个参数。它的值可以从 /proc/sys/fs/file-max 文件得到;同样地,你也可以直接修改该文件来更改可以直接打开的文件总数。
提示 :对 /proc 目录中文件进行写操作需要超级用户的权限。在修改数据时一定要小心,写入不当的值很可能会导致严重的后果。
/proc 目录中还有一类文件以数字命名 。比如,当我们使用 ps 命令查看当前正在运行的进程时,会显示每个进程的 PID 。每个进程都会对应 /proc 目录下一个以该 pid 值命名的文件。如果你要查看该进程的具体信息,可以直接读取文件 /proc/(pid) 。在列出的文件中, cmdline 文件会显示该进程由谁启动的;你可以使用 cat 命令或者 od 命令来查看。