1、在linux中,一切(几乎一切)都是文件,包括文件目录。磁盘文件、串行口、打印机和其他设备都是用相同的文件访问方式,很多情况下,访问只需要使用5个基本的函数:open、close、read、write和ioctl(把控制信息给设备驱动程序)。
2、所有用户通常使用上层的opendir/readdir接口来读取目录。
3、文件,除了本身包含的内容以外,它还有一个名字和属性,即“管理信息”,包括文件的创建/修改日期和它的访问权限。这些属性被保存在文件的inode(节点)中,这些节点是文件系统中的一个特殊数据块,同时包含文件的长度和文件在磁盘中的存放位置。系统使用的是文件的inode编号,目录结构为文件命名仅仅方便用户使用。
4、目录用于保存其他文件的节点号和名字的文件,目录文件中的每个数据项都是指向某个文件节点的链接,删除文件等于删除与只对应的目录项,同时指向该文件的链接数减1,但是文件数据仍可以通过其他指向该文件的链接访问到,如果指向某个文件的链接数(即ls -l)命令的输出中跟在访问权限后面的那个数字为0,就表示该节点以及其指向的数据不再被使用,磁盘上的相应位置就会被标记为可用空间。
5、可以将一个硬件设备映射为文件,作为超级用户,可以使用命令将IDE CD-ROM驱动器挂载为一个文件:
mount -t iso9660 /dev/hdc /mnt/cdrom
cd /mnt/cdrom
6、linux/unix中比较重要的三个设备文件:/dev/console, /dev/tty, /dev/null。
7、直接使用底层系统调用(open/read/write/close/ioctl)来进行输入输出操作的效率比较低,主要因为:(1)使用系统调用会影响系统的性能,由于需要从用户代码切换到内核代码,这种开销很大;(2)硬件会限制对底层系统调用一次所能读写的数据块大小。因此,为了给设备和磁盘文件提供更高层的接口,linux提供了一系统的标准函数库,可以让用户应用到自己的程序中。
8、底层文件访问。每个运行中的进程有一些与只关联的文件描述符,当一个程序开始运行时,它一般有3个已经打开的文件描述符:0: 标准输入;1:标准输出;2:标准错误。
9、标准输出示例
#include <unistd.h>#include <stdlib.h>
#include <string.h>
int main(){
int len = strlen("hello,world!\n");
int rc = write(1,"hello,world!\n",len);//write to std-output
if(rc != len){
write(2,"write failed..\n", 16);//2 - std-error
}
return 0;
}
10、从标准输入读取数据示例
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main(){
char buffer[128] = {0};
int nread;
nread = read(0, buffer, 128);
if(nread==-1)
write(2,"read errror!\n",16);
if((write(1,buffer,nread))!= nread)
write(2,"write error!\n",16);
return 0;
}
test:
$ gcc -o simple_read simple_read.c
$ chmod +x simple_read
$ echo hello,world! | ./simple_read
hello,world!
$ ./simple_read < simple_write.c
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main(){
int len = strlen("hello,world!\n");
int rc = write(1,$
//only get 128 bytes from simple_write.c, and $ is following behind