一、Linux文件操作
-
创建
int creat(const char *filename, mode_t mode);
参数mode指定新建文件的存取权限,它同umask一起决定文件的最终权限(mode&umask)。
-
打开
int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode);
open函数有两个形式,其中pathname是我们要打开的文件名,flags指定打开的方式。
-
读写
int read(int fd, const void *buf, size_t length); int write(int fd, const void *buf, size_t length);
参数buf为指向缓冲区的指针,length为缓冲区的大小(以字节为单位)。
函数read实现从文件描述符fd所指定的文件中读取length个字节到buf所指向的缓冲区中,返回值为实际读取的字节数。
函数write实现把length个字节从buf指向的缓冲区中写到文件描述符fd所指向的文件中,返回值为实际写入的字节数。 -
定位
int lseek(int fd, offset_t offset, int whence);
将文件读写指针相对whence移动offset个字节。操作成功时,返回文件指针相对于文件头的位置。
-
关闭
int close(int fd);
当我们操作完成以后,要关闭文件,此时,只要调用close就可以了,其中fd是我们要关闭的文件描述符。
二、Linux文件系统
/bin:包括基本命令,如ls、cp、mkdir等,这个目录中的文件都是可执行的。
/sbin:包括系统命令,如modprobe、ifconfig等,大多是涉及系统管理的命令,这个目录中的文件都是可执行的。
/dev:设备文件存储目录,应用程序通过对这些文件的读写和控制以访问实际的设备。
/etc:系统配置文件的所在地。busybox的启动脚本也存放在该目录。
/lib:系统库文件存放目录。
/mnt:这个目录一般是用于存放挂载存储设备的挂载目录。
/opt:opt是“可选”的意思,有些软件包会被安装在这里。
/proc:操作系统运行时,进程及内核信息(比如CPU、硬盘分区、内存信息等)存放在这里。
/tmp:用户运行程序的时候,有时会产生临时文件,存放在这里。
/usr:这个是系统存放程序的目录,比如用户命令、用户库等。
/var:var表示变化的意思,这个目录的内容经常变动,如/var/log目录被用于存放系统日志。
/sys:Linux2.6以后的内核所支持的sysfs文件系统被映射在此目录上。Linux设备驱动模型中的总线、驱动和设备都可以在此找到对应的节点。
三、文件系统与设备驱动
如下图所示为Linux中虚拟文件系统(VFS)、磁盘/flash文件系统及一般的设备文件与设备驱动程序之间的关系。
应用程序
-----------|------------------ 系统调用
VFS
-----------|---------------- file_operations
设备文件
|
字符设备驱动
|
字符设备
四、设备文件系统udev
udev在用户空间中执行,动态建立/删除设备文件,允许每个人都不用关心主/次设备号而提供LSB名称,并且可以根据需要固定名称。
udev的工作过程如下:
- 当内核检测到系统中出现了新设备后,内核会通过netlink套接字发送uevent。
- udev获取内核发送的信息,进行规则的匹配。
在嵌入式系统中,也可以用udev的轻量级版本mdev,mdev集成于busybox中。在编译busybox的时候,选中mdev相关项目即可。