03-系统调用方式文件编程

来源:互联网 发布:关口知宏中国铁道记行 编辑:程序博客网 时间:2024/05/28 03:03

    • 一命令查询man
    • 二文件编程的相关函数说明
    • 三文件编程例子

上篇文章提到,Linux应用程序设计中需要的外部函数主要由函数库(标c及其拓展)和系统调用(posix及其拓展)来提供。
本篇就通过实例,讲解通过“系统调用”(glibc调用Linux内核的函数)来实现文件编程。

一、命令查询man

  1. 命令格式:

    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特定的), 用来存放内核例行程序的文档

  2. 命令示例:

    例子: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

参数说明pathname被打开的文件名(可包括路径名如”dev/ttyS0”)flags

文件打开方式;

O_RDONLY:以只读方式打开文件;

O_WRONLY:以只写方式打开文件;

O_RDWR:以读写方式打开文件;

O_CREAT:如果改文件不存在,就创建一个新的文件,并用第三个参数为其设置权限;

O_EXCL:如果使用O_CREAT时文件存在,则返回错误消息。这一参数可测试文件是否存在。此时open是原子操作,防止多个进程同时创建同一个文件;

O_NOCTTY:使用本参数时,若文件为终端,那么该终端不会成为调用open()的那个进程的控制终端O_TRUNC:若文件已经存在,那么会删除文件中的全部原有数据,并且设置文件大小为0 O_APPEND:以添加方式打开文件,在打开文件的同时,文件指针指向文件的末尾,即将写入的数据添加到文件的末尾;

O_NONBLOCK: 如果pathname指的是一个FIFO、一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I/O操作设置非阻塞方式;

O_SYNC:使每次write都等到物理I/O操作完成;

O_RSYNC:read 等待所有写入同一区域的写操作完成后再进行 在open()函数中,falgs参数可以通过“|”组合构成,但前3个标准常量

(O_RDONLY,O_WRONLY,和O_RDWR)不能互相组合;

perms被打开文件的存取权限,可以用两种方法表示,可以用一组宏定义;S_I(R/W/X)(USR/GRP/OTH),其中R/W/X表示读写执行权限,USR/GRP/OTH分别表示文件的所有者/文件所属组/其他用户,如S_IRUUR|S_IWUUR|S_IXUUR,(-rex——),也可用八进制800表示同样的权限创建文件: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 ;}
0 0