Linux 文件访问--- 系统调用
2013-03-01 16:27
246 查看
(1) Linux 中文件编程可以使用两种方法:
1,Linux 系统调用.2,C语言库函数.
前者依赖于 Linux 系统,后者与操作系统是独立的,在任何操作系统下,
使用 C语言库函数操作文件的方法是相同的,是一标准接口.
(2) 系统调用--- 创建 creat :
函数: int creat ( const char * filename , mode_t mode ).filename :要创建的文件名 ( 包含路径,缺省为当前路径 ).
mode : 创建模式.
常见创建模式:
S_IRUSR 可读
S_IWUSR 可写
S_IXUSR 可执行
S_IRWXU 可读、写、执行
示例代码:
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> void create_file(char *filename){ /*创建的文件具有什么样的属性?*/ if(creat(filename,0755)<0){ printf("create file %s failure!\n",filename); exit(EXIT_FAILURE); }else{ printf("create file %s success!\n",filename); } } int main(int argc,char *argv[]){ int i; if(argc<2){ perror("you haven't input the filename,please try again!\n"); exit(EXIT_FAILURE); } for(i=1;i<argc;i++){ create_file(argv[i]); } exit(EXIT_SUCCESS); }
其中 main 中 argc 参数 表示输入参数个数,程序名称是第一个参数,所有参数保存在 argv 数组中.
char * argv [ ] 指向数组的指针.
(3) 文件描述:
在 Linux 系统中,所有打开的文件都对应一个 文件描述符 .文件描述符的本质是一个 非负整数 . 当打开一个文件时,该整数由系统来分配,文件描述符的
范围是 0 - OPEN_MAX ,现在很多系统增加至 1024.
(4) 系统调用--- 打开 open:
函数: int open ( const char * pathname , int flags) .int open ( const char * pathname , int flags , mode_t mode) .
pathname : 要打开的文件名 ( 包含路径,缺省为当前路径).
flags : 打开标志.
常见的打开标志:
O_RDONLY 只读方式打开
O_WRONLY 只写方式打开
O_RDWR 读写方式打开
O_APPEND 追加方式打开
O_CREAT 创建一个文件
O_NOBLOCK 非阻塞方式打开
如果使用了 O_CREAT 标志,则使用的函数是:int open ( const char * pathname , int flags , mode_t mode) .
这时需要指定 mode 来表示文件的访问权限.
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int main(int argc ,char *argv[]){ int fd; if(argc<2){ puts("please input the open file pathname!\n"); exit(1); } if((fd=open(argv[1],O_CREAT|O_RDWR,0755))<0){ perror("open file failure!\n"); exit(1); }else{ printf("open file %d success!\n",fd); } close(fd); exit(0); }// 如果flag参数里有 O_CREAT 表示,该文件如果不存在 , 系统则会创建该文件 , 该文件的权限由第三个参数决定 , 此处为0755 .
// 如果flah参数里没有 O_CREAT 参数 , 则第三个参数不起作用.此时,如果要打开的文件不存在,则会报错 .
// 所以 fd=open(argv[1],O_RDWR) , 仅仅只是打开指定文件 .
(5) 系统调用--- 关闭 close:
当我们操作完文件以后,需要关闭文件.函数: int close ( int fd ) .
fd :文件描述符 . 来源: fd=open(argv[1],O_CREAT|O_RDWR,0755))<0 .打开文件时候系统由返回.
(6) 系统调用--- 读 read:
函数: int read ( int fd , const void * buf , size_t length) .功能: 从文件描述符 fd 所指定的文件 中读取 length 个字节到 buf 所指向的缓冲区中,
返回值为实际读取的字节数.
(7) 系统调用--- 写 write:
函数: int write ( int fd , const void * buf , size_t length) .功能: 把 length 个字节从 buf 所指向的缓冲区中写到文件描述符 fd 所指向的文件中,
返回值为实际写入的字节数.
(8) 系统调用--- 移动 lseek:
函数: int lseek ( int fd , offset_t offset , int whence ) .功能:将文件读写指针相对 whence 移动 offset 个字节,操作成功时,
返回文件指针相对于文件头的位置 .
whence 可使用下述值:
SEEK_SET :相对文件开头 .
SEEK_CUR:相对文件读写指针的当前位置 .
SEEK_END:相对文件末尾 .
offset 可取负值 ,表示向前移动 .
例如: lseek ( fd , -5 , SEEK_CUR ) . 将文件指针相对当前位置向前移动 5 字节.
lseek ( fd , 0 , SEEK_END ) . 返回值为文件长度,因为 lseek 函数返回值为文件指针相对
于文件头的位置.
(9) 系统调用--- 权限判断 access:
有时我们需要判断文件是否可以进行某种操作 ( 读,写 等),这时可以使用 access 函数 .函数: int access ( const char *pathname , int mode ) .
pathname : 文件名称 .
mode : 要判断的访问权限 . 可以取下值或是他们的组合.
R_OK : 文件可读 .
W_OK: 文件可写 .
X_OK: 文件可执行 .
F_OK: 文件存在 .
返回值:当我们测试成功时,函数返回 0 ,否则如果一个条件不符时, 返回 -1 .
相关文章推荐
- linux 应用程序设计基础--系统调用访问文件
- Linux底层文件访问---read系统调用
- Linux下通过系统调用(API)和C语言库函数对文件进行访问
- linux_c 网络开发日记(3)系统调用方式访问文件
- Linux文件编程,时间编程——系统调用-文件访问
- linux系统编程之文件与IO(四):目录访问相关系统调用
- linux系统调用方式访问文件
- Linux下通过系统调用(API)和C语言库函数对文件进行访问
- Linux下通过系统调用(API)和C语言库函数对文件进行访问
- Linux下通过系统调用(API)和C语言库函数对文件进行访问
- Linux下通过系统调用(API)和C语言库函数对文件进行访问
- Tiny6410学习ing—(二)、嵌入式Linux应用开发—(2)、文件编辑(系统调用方式访问文件)—①
- Linux下系统调用访问文件
- Linux下通过系统调用(API)和C语言库函数对文件进行访问
- sysfs 文件系统 通过设备属性访问硬件(DEVICE_ATTR, LINUX)
- 使用 /proc 文件系统来访问 Linux 内核的内容
- 使用 /sys 文件系统访问 Linux 内核
- (cc)2.6版本Linux上替换系统调用函数实现隐藏文件学习
- [GNU/Linux] Linux系统调用-文件操作(一)
- 系统调用-文件访问 创建、打开、关闭、读、写