之前以为在内核中不能创建文件,其实不是这样子的,只要文件系统跑起来之后就可以像在用户空间一样操作文件.
用户空间 内核
open() sys_open(), filp_open()
close() sys_close(), filp_close()
read() sys_read(), filp_read()
write() sys_write(), filp_write()
----------------------------------------------------
在内核模块中有时会用不了 sys_xxxx, 这时用 filp_xxxx 对应的函数就行了, 在模块中使用 sys_xxxx 还有问题, 还没有找到原因.
在 /tmp 中创建文件 aa
struct file *filep;
filep=filp_open("/tmp/aa",O_CREAT | O_RDWR,0);
if(IS_ERR(filep))
return -1;
filp_close(filep,0);
return 0;
下面 open 使用的一些参数:
O_ACCMODE ;: 读写文件操作时,用于取出flag的低2位。
O_RDONLY;: 只读打开
O_WRONLY;: 只写打开
O_RDWR;: 读写打开
O_CREAT;: 文件不存在则创建,需要mode_t,not fcntl
O_EXCL;: 如果同时指定了O_CREAT,而文件已经存在,则出错, not fcntl
O_NOCTTY;: 如果pathname指终端设备,则不将此设备分配作为此进程的控制终端。not fcntl O_TRUNC;: 如果此文件存在,而且为只读或只写成功打开,则将其长度截短为0。not fcntl
O_APPEND;: 每次写时都加到文件的尾端
O_NONBLOCK;: 如果p a t h n a m e指的是一个F I F O、一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I / O操作设置非阻塞方式。
O_NDELAY;;
O_SYNC;: 使每次write都等到物理I/O操作完成。
FASYNC;: 兼容BSD的fcntl同步操作
O_DIRECT;: 直接磁盘操作标识
O_LARGEFILE;: 大文件标识
O_DIRECTORY;: 必须是目录
O_NOFOLLOW;: 不获取连接文件
O_NOATIME;: 暂无
当新创建一个文件时,需要指定mode 参数,以下说明的格式如宏定义名称;: 描述。
S_IRWXU;:文件拥有者有读写执行权限
S_IRUSR (S_IREAD);:文件拥有者仅有读权限
S_IWUSR (S_IWRITE);:文件拥有者仅有写权限
S_IXUSR (S_IEXEC);:文件拥有者仅有执行权限
S_IRWXG;:组用户有读写执行权限
S_IRGRP;:组用户仅有读权限
S_IWGRP;:组用户仅有写权限
S_IXGRP;:组用户仅有执行权限
S_IRWXO;:其他用户有读写执行权限
S_IROTH;:其他用户仅有读权限
S_IWOTH;:其他用户仅有写权限
S_IXOTH;:其他用户仅有执行权限
阅读(1177) | 评论(0) | 转发(0) |