您的位置:首页 > 运维架构 > Linux

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 .
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: