linux系统下库函数和系统调用都对文件的基本操作

来源:互联网 发布:php动态网页设计 编辑:程序博客网 时间:2024/05/20 22:38
1.linux 系统调用


linux系统调用的I/O操作主要涉及到五个函数,open、read、write、close 和lseek。涉及的头文件<unistd.h>,<fcntl.h>


linux系统的文件操作符为一个0-OPEN_MAX之间的非负整数,其中:
0:STDIN_FILENO  标准输入
1:STDOUT_FILENO 标准输出
2:STDERR_FILENO 标准错误


int open(const char *pathname,int flags,mode_t mode)
作用:打开和创建文件
返回值:成功返回文件描述符,失败返回-1 。
说明:第一个参数,指定文件路径;
      第二个参数,用于指定文件的打开创建模式,可以为以下常量:
      O_RDONLY, 只读模式
      O_WRONLY, 只写模式
      O_RDWR, 读写模式
      打开创建文件时,至少使用以上三个常量中的一个,还有一些备选常量:
      O_APPEND, 每次写操作都写入文件末尾
      O_CREAT,  文件不存在,则创建文件
      O_NONBLOCK,  如果路径名指向FIFO/块文件/字符文件,则把文件的打开并将I/O设为非阻塞模式。
      还有一些别的参数,大家有需要的可查询相关函数定义。
      第三个参数,主要用于创建文件时设定文件的访问权限,其他时候可忽略。


int read(int fd,void *buf,size_t nbyte)
作用:从文件读入数据
返回值:成功返回读入的字节数,若到文件末尾则返回0,出错返回-1 。


ssize_t write(int fd,const void *buff,size_t nbytes)
作用:向文件写入数据
返回值:成功返回已经写入的字节数,出错返回-1


int close(int fd)
作用:关闭文件描述符
返回值:成功返回0,出错返回-1.


off_t lseek(int fd, off_t offset, int whence)
作用:指定文件指针的位置。
返回值:成功返回新的文件指针位置,出错返回-1.
说明:第一个参数为文件描述符
      第二个参数为文件移动的偏移量
      第三个为文件移动的起点,可以为以下三个值:
SEEK_SET  0   从文件头开始
SEEK_CUR  1   从当前位置开始
        SEEK_END  2   从文件末尾开始
      当1,2情况下,offset可以为负值。


------------------------------------------------------------------------------------------------------------------
2. 通过库函数操作文件<stdio.h>
FILE *fopen(const char *filename, const char *mode)
说明:第一个参数为文件路径
      第二个参数可以为“r/rb[+]” "w/wb[+]"  "a/ab[+]"
      一个程序运行时,默认打开了stdin,stdout,stderr三个文件指针,即标准输入/输出/错误输出。


size_t fread(void *ptr, size_t size, size_nitems, FILE *fd)
说明:第一个参数为存储数据的指针
      第二个参数指定读入的字节数
      第三个参数指定读操作次数
      第四个参数为文件指针对象。


size_t fwrite(const void *ptr, size_t size, size_nitems, FILE *fd)
说明:第一个参数为被写入数据的指针
      第二个参数指定写入的字节数
      第三个参数指定写操作次数
      第四个参数为文件指针对象


int fclose(FILE *fd)
说明:释放文件指针。


int fseek(FILE *fd, long int offset int whence)
说明:各参数含义与系统调用lseek相似,两个函数返回值不同,一个是偏移量,而fseek则用0表示成功,-1表示失败。
-----------------------------------------------------------------------------------------------------------
3,区别
系统调用通常用于底层文件访问(low-level file access),例如在驱动程序中对设备文件的直接访问。
系统调用是操作系统相关的,因此一般没有跨操作系统的可移植性。
系统调用发生在内核空间,因此如果在用户空间的一般应用程序中使用系统调用来进行文件操作,会有用户空间到内核空间切换的开销。


库函数调用通常用于应用程序中对一般文件的访问。
库函数调用是系统无关的,因此可移植性好。
由于库函数调用是基于C库的,因此也就不可能用于内核空间的驱动程序中对设备的操作。


库函数对文件的操作实际上是通过系统调用来实现的,但由于缓冲区技术的使用,导致库函数调用可以降低系统调用的次数,进而降低了开销。
原创粉丝点击