在内核中创建文件 filp_open/sys_open


 
 
之前以为在内核中不能创建文件,其实不是这样子的,只要文件系统跑起来之后就可以像在用户空间一样操作文件.
 
用户空间                   内核
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;
 
========================================
sys_open 的使用方法:
#include <linux/fs.h>
 
......
 u8  Buff[50];
 int fd;
 memset(Buff, 0x00, sizeof(Buff));
  mm_segment_t old_fs = get_fs();
 set_fs(KERNEL_DS);
 fd = sys_open("/etc/Info", O_RDONLY, 0);
 if(fd>=0)
 {
  sys_read(fd, Buff, 50);
  printk("string: %s/n", Buff);
  sys_close(fd);
 }
 set_fs(old_fs);
 
 
========================================
下面 open 使用的一些参数:
O_ACCMODE <0003>;: 读写文件操作时,用于取出flag的低2位。 
O_RDONLY<00>;: 只读打开 
O_WRONLY<01>;: 只写打开 
O_RDWR<02>;: 读写打开 
O_CREAT<0100>;: 文件不存在则创建,需要mode_t,not fcntl 
O_EXCL<0200>;: 如果同时指定了O_CREAT,而文件已经存在,则出错, not fcntl 
O_NOCTTY<0400>;: 如果pathname指终端设备,则不将此设备分配作为此进程的控制终端。not fcntl O_TRUNC<01000>;: 如果此文件存在,而且为只读或只写成功打开,则将其长度截短为0。not fcntl 
O_APPEND<02000>;: 每次写时都加到文件的尾端 
O_NONBLOCK<04000>;: 如果p a t h n a m e指的是一个F I F O、一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I / O操作设置非阻塞方式。 
O_NDELAY;; 
O_SYNC<010000>;: 使每次write都等到物理I/O操作完成。 
FASYNC<020000>;: 兼容BSD的fcntl同步操作 
O_DIRECT<040000>;: 直接磁盘操作标识 
O_LARGEFILE<0100000>;: 大文件标识 
O_DIRECTORY<0200000>;: 必须是目录 
O_NOFOLLOW<0400000>;: 不获取连接文件 
O_NOATIME<01000000>;: 暂无 
当新创建一个文件时,需要指定mode 参数,以下说明的格式如宏定义名称<实际常数值>;: 描述。 
S_IRWXU<00700>;:文件拥有者有读写执行权限 
S_IRUSR (S_IREAD)<00400>;:文件拥有者仅有读权限 
S_IWUSR (S_IWRITE)<00200>;:文件拥有者仅有写权限 
S_IXUSR (S_IEXEC)<00100>;:文件拥有者仅有执行权限 
S_IRWXG<00070>;:组用户有读写执行权限 
S_IRGRP<00040>;:组用户仅有读权限 
S_IWGRP<00020>;:组用户仅有写权限 
S_IXGRP<00010>;:组用户仅有执行权限 
S_IRWXO<00007>;:其他用户有读写执行权限 
S_IROTH<00004>;:其他用户仅有读权限 
S_IWOTH<00002>;:其他用户仅有写权限 
S_IXOTH<00001>;:其他用户仅有执行权限
博主注:文件斜体部分必须加上,
否则读写文件时,返回值为-14(Bad Address)
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值