上篇文章提到,Linux应用程序设计中需要的外部函数主要由函数库(标c及其拓展)和系统调用(posix及其拓展)来提供。
本篇就通过实例,讲解通过“系统调用”(glibc调用Linux内核的函数)来实现文件编程。
一、命令查询man
命令格式:
man number function 这个是查看函数的命令 number的取值:
1、Standard commands (标准命令)
2、System calls (系统调用)
3、Library functions (库函数)
4、Special devices (设备说明)
5、File formats (文件格式)
6、Games and toys (游戏和娱乐)
7、Miscellaneous (杂项)
8、Administrative Commands (管理员命令)
9 其他(Linux特定的), 用来存放内核例行程序的文档命令示例:
例子: man ls 查看Linux标准命令ls的说明 man 2 open 查看Linux内核的函数open的说明 man 3 open 查看用户态的库函数open的说明,这用户态的函数都是基于Linux函数写的
二、文件编程的相关函数说明
查看函数命令:man 2 函数名
打开文件:open | |||||||
函数原形 | int open(const char *pathname,int flags,int perms) | ||||||
函数功能 | 用于打开或创建文件,在打开或创建文件时可以指定文件的属性及用户的权限等各种参数 | ||||||
头文件 | #include《sys/types.h》 #include 《sys/stat.h》 #include 《fcntl.h》 | ||||||
返回值 | 成功:返回文件描述符; 失败:返回-1 | ||||||
参数说明 |
|
创建文件:create | |
函数功能: | 创建一个文件,并以字写的方式打开; |
函数头文件: | p>#include《sys/types.h》 #include 《sys/stat.h》 #include 《fcntl.h》 |
函数原型: | int creat( const char *pathname,mode_t mode) ; |
函数参数: | pathname:打开文件的路径名,如:/home/nan/test.c; mode:创建文件的权限; |
函数返回值: | 成功:返回文件描述符; 失败:返回-1 |
关闭文件:close | |
函数功能: | 关闭一个打开的文件; |
函数头文件: | #include 《unistd.h》 |
函数原型: | int close( int fd ) ; |
函数参数: | fd:待关闭的文件描述符; |
函数返回值: | 成功:返回0; 失败:返回-1 |
读文件:read | |
函数功能: | 从一个打开的文件中读取数据; |
函数头文件: | #include 《unistd.h》 |
函数原型: | ssize_t read( int fd , void *buf , size_t count ) ; |
函数参数: | fd:想要读取数据的文件描述符; buf:希望将读取的数据存放的位置; count:希望读取的字节数 |
函数返回值: | 成功:读取的字节数; 失败:返回-1 |
写文件:write | |
函数功能: | 往一个打开的文件中写入数据; |
函数头文件: | #include 《unistd.h》 |
函数原型: | ssize_t write(int fd , const void *buf , size_t count) ; |
函数参数: | fd:希望写入数据的文件描述符; buf:希望写入文件的数据; count:希望写入数据的字节数; |
函数返回值: | 成功:写入数据的字节数; 失败:返回-1 |
定位文件:lseek | |
函数功能: | 重新定位文件 的读写位置; |
函数头文件: | #include 《unistd.h》 #include 《sys/types.h》 |
函数原型: | off_t lseek(int fd , off_t offset , int whence ) ; |
函数参数: | fd:希望重定位的文件描述符; offset:根据第三个参数whence指定的文件指针位置来移动的字节数; whence:文件指针从什么位置开始移动;SEEK_SET:文件的开头位置指针; SEEK_CUR:文件指针的当前位置; SEEK_END:文件的末尾指针; |
函数返回值: | 成功:返回当前的文件指针距离文件头的位置; 失败:返回-1 |
复制文件描述符 :dup | |
函数功能: | 复制一个文件描述符; |
函数头文件: | #include 《unistd.h》 |
函数原型: | int dup(int oldfd) ; int dup2(int oldfd , int newfd) ; int dup3(int oldfd , int newfd , int flags) ; |
函数参数: | oldfd:待复制的文件描述符; |
函数返回值: | 成功:返回新的文件描述符; 失败:返回-1 |
三、文件编程例子:
功能:复制一个文件。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main( int argc , char **argv ) {
int fd_f = open( argv[1] , O_RDONLY ) ;
int fd_t = open( argv[2] , O_RDWR|O_CREAT,0666 ) ;
char buf[512] = {0} ;
int count ;
if( 0 > fd_f || 0 > fd_t )
return -1 ;
while( 0<(count=read(fd_f,buf,512)) ) {
write( fd_t , buf , count ) ;
}
close( fd_f ) ;
close( fd_t ) ;
return 0 ;
}