Linux 的文件操作系统调用(在Windows 编程领域,习惯称操作系统提供的接口
为API)涉及创建、打开、读写和关闭文件。
1.创建
int creat(const char *filename,mode_t mode);
mode指定新建文件的存取权限,umask代表文件在创建时需要去掉的一些存取权限。
int umask(int newmask);
2.打开
int open(const char *pathname,int flags,mode_t mode);
open()函数中,pathname是文件名,flag为O_RDONLY,OWRONLY,O_RDWR,
O_APPEND,O_CREAT,O_EXEC,O_NOBLOCK,O_TRUNC....MODE为访问权限
mode有S_IRUSR用户读,S_IWUSR用户写,S-IXUSR等
除了可以通过上述宏进行“或”逻辑产生标志以外,我们也可以自己用数字来表
示,Linux 总共用5 个数字来表示文件的各种权限:第一位表示设置用户ID;第二位
表示设置组ID;第三位表示用户自己的权限位;第四位表示组的权限;第五位表示其
他人的权限。每个数字可以取1(执行权限)、2(写权限)、4(读权限)、0(无)或
者是这些值的和。
3.读写
int read(int fd,const void *buf,size_t length);
int write(int fd,const void *buf,size_t length);。函
数read()实现从文件描述符fd所指定的文件中读取length个字节到buf所指向的缓冲
区中,返回值为实际读取的字节数。函数write 实现将把length 个字节从buf 指向的
缓冲区中写到文件描述符fd所指向的文件中,返回值为实际写入的字节数。
int open(pathname, O_CREAT | O_WRONLY | O_TRUNC, mode);
4.定位
int lseek(int fd ,offset_t offset,int whence);
lseek()将文件读写指针相对whence移动offset个字节,成功返回文件指针相对文件头的位置
SEEK_SET:相对文件开头
SEEK_CUR:相对文件的当前位置
SEEK_END:相对文件末尾
当offset为负值时,表示向前移动
lseek(fd ,0,SEEK_END);返回文件的而长度
5,关闭int(int fd);
c库函数的文件操作
FILE *fopen( const char *path,const *mode);
其中mode为打开模式:r b ,w wb....b为二进制文件
2.读写
size_t fread(void *ptr,size_t size,size_t n,FILE *stream);
size_t write(void *ptr,size_t size,size_t n,FILE *stream);
fread()实现从stream中读取n 个字段,每个字段为size个字节,并将读取的字段
放入ptr 所指的字符数组中,返回实际已读取的字段数。在读取的字段数小于num时,
可能是在函数调用时出现错误,也可能是读到文件的结尾。所以要通过调用feof()和
ferror()来判断。
write()实现从缓冲区ptr 所指的数组中把n 个字段写到stream 中,每个字段长为
size个字节,返回实际写入的字段数。
3.关闭
int fclose(FILE *stream);
//buf为指向缓冲区的指针,length为缓冲区的大小,
devfs
1.可以通过程序初始化时在/dev目录下创建设备文件,卸载时将它删除。
2.设备驱动程序可以指定设备名,所有者和权限位,用户空间程序也可以修改。
3.不需要给设备程序分配主设备号以及此设备号,在程序中可以直接register_chardev()传递0主设备号以获得可用的主设备号,并在devfs_register()指定此设备号。
/*创建设备目录*/
devfs_handle_t devfs_mk_dir(devfs_handle_t dir,const char name,void *info);
/*创建设备文件*/
devfs_handle_t devfs_register(devfs_handle_t dir,const char *name ,....);
/*撤销设备文件*/
void devfs_unregister(devfs_handle_t dev);
udev利用设备加入或是移除内核所发送的热插拔事件来工作。在热插拔时,设备详细的信息由netlink套接字来发送出来的。事件叫uevent.