文件编程之Linux下系统调用

说明:
linux下文件编程可使用两种方法:
****linux系统调用
****C语言库函数

前者依赖于linux系统,后者与操作系统是独立的。
在任何操作系统下,使用C语言库函数操作文件的方法都是相同的。

这里首先记录下Linux下系统调用操作文件编程的学习过程。
函数原型:
1、系统调用--创建:
int create(const char *filename, mode_t mode);

filename为要创建的文件名(包含路径,缺省为当前路径);
mode为创建模式。

模式可用数字来表示:
可执行为1;
可写为2;
可读为4;
上述和,如可写可读为6,对应文件权限。


文件描述符:在linux系统中,所有打开的文件都对应一个文件描述符。

2、系统调用--打开:
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标志,则使用带mode的open函数,这时要指定文件权限。

3、系统调用--关闭
int close(int fd);

fd为打开的文件描述符。

4、系统调用--读
int read(int fd, const void *buf, size_t length);

功能:从fd所指定的文件中读取length个字节到buf所指向的缓冲区中,
返回值为实际读取的字节数。

5、系统调用--写
int write(int fd, const void *buf, size_t length);

功能:把length个字节从buf指向的缓冲区中写到fd所指向的文件中,
返回实际写入的字节数。

6、系统调用--定位
int lseek(int fd, offset_t offset, int whence);

功能:将文件读写指针相对whence移动offset个字节。
操作成功,返回文件指针相对于文件头的位置。

whence可用下数值:
SEEK_SET 相对文件开头
SEEK_CUR 相对文件读写指针的当前位置
SEEK_END 相对文件末尾

offset可取负值,表示向前移动。

计算文件长度时,可用 lseek(fd, 0, SEEK_END);

7、系统调用--访问判断
int access(const char *pathname, int mode);

功能:判断文件是否可以进行某种操作。

mode可取R_OK可读、W_OK可写、X_OK可执行、F_OK文件存在。

返回值:测试成功时,返回0,否则返回-1。

代码实例如下:

 1 ****************************************
 2     功能:实现文件的复制工作;
 3           练习文件操作的系统调用函数的使用
 4                     如:open、close、read、write、lseek
 5         编译:gcc linux_file_cp.c
 6         执行:./a.out src_file dst_file
 7         说明:src_file为保存有原来内容的文件
 8               dst_file为要创建的文件。
 9     日期:2015.9.22
10 *****************************************/
11 
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <unistd.h>
15 #include <sys/types.h>
16 #include <sys/stat.h>
17 #include <fcntl.h>
18 
19 #define BUFFER_SIZE 1024 
20 
21 int main(int argc,char **argv) 
22 { 
23     int from_fd;
24     int to_fd; 
25     long file_len=0;
26     char buffer[BUFFER_SIZE]; 
27     char *ptr; 
28     
29     /*判断入参*/
30     if(argc!=3) 
31     { 
32         printf("Usage:%s fromfile tofile
",argv[0]); 
33         exit(1); 
34     } 
35 
36 /* 打开源文件 */ 
37 if((from_fd=open(argv[1], O_RDONLY)) == -1) 
38 { 
39     printf("Open %s Error
",argv[1]); 
40     exit(1); 
41 } 
42 
43 /* 创建目的文件 */
44 /*如果目的文件不存在,则创建*/ 
45 if((to_fd=open(argv[2], O_RDWR | O_CREAT, 0666)) == -1) 
46 { 
47     printf("Open %s Error
",argv[2]); 
48     exit(1); 
49 } 
50 
51 /*测得文件大小*/
52 file_len = lseek(from_fd, 0L, SEEK_END);
53 lseek(from_fd, 0L, SEEK_SET);
54 printf("from file size is= %d
",file_len);
55 
56 /*进行文件拷贝*/
57 while((read(from_fd, buffer, BUFFER_SIZE)) != 0)
58 { 
59     write(to_fd, buffer, file_len);
60 } 
61 close(from_fd); 
62 close(to_fd); 
63 exit(0); 
64 } 
原文地址:https://www.cnblogs.com/paladinzxl/p/4829008.html