文件编程之系统调用方式
2015-08-02 22:19
344 查看
摘要
首先了解文件描述符的概念:在Linux系统中,所有打开的文件对应一个数字,这个数字由系统分配,该数字称为文件描述符。系统调用文件编程时需要用到文件描述符。与文件编程有关的操作主要有打开文件、创建文件、关闭文件、读文件、写文件、文件定位、复制文件描述符,这些操作的函数可通过系统调用方式使用。相关函数都能在Unix环境高级编程中查找到,在Linux系统中使用man命令能帮助我们详细了解相应函数。
文件编程相关函数及使用
open函数
原型:int open(const char *pathname,int flags); int open(const char *pathname,int flags,mode_t mode); 头文件:<sys/types.h><sys/stat.h><fcntl.h> 功能:打开或者创建一个文件,成功返回文件描述符,失败返回-1 参数:pathname:要打开的文件名(含路径) flags:文件打开的标志 O_RDONLY:只读 O_WRONLY:只写 O_RDWR:可读可写 以上三选项必须且只能指定一项;以下参数是可选的,与其它选项“位或”得到flags参数 O_APPEND:每次写时都追加到文件尾端 O_CREAT:当打开的文件不存在时创建该文件 mode:当flags中使用了O_CREAT时使用,mode记录了待创建的文件的访问权限。
#include<stdio.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> void main() { int fd=open("/root/test1.c",O_RDWR | O_CREAT,0777); if(fd<0) { printf("file open fail!\n"); } else { printf("the file descriptor is %d\n",fd); } }
create函数
原型:int creat(const char *pathname, mode_t mode) 头文件:<sys/types.h><sys/stat.h><fcntl.h> 功能:创建一个文件,并以只写的方式打开该文件,成功返回文件描述符,失败返回-1 参数:pathname:创建的文件名(含路径) mode:创建的文件的读写权限
void main() { int fd=creat("/root/test1.c",0777); if(fd<0) { printf("file creat fail!\n"); } }
close函数
原型:int close(int fd) 头文件:<unistd.h> 功能:关闭一个打开的文件,成功返回0,失败返回-1 参数:fd:待关闭文件的文件描述符
read函数
原型:ssize_t read(int fd,void *buf,size_t count) 头文件:<unistd.h> 功能:从一个打开的文件读取数据,成功返回读取的字节数,失败-1 参数:fd:要读取的文件的描述符 buf:读取来的文件存放在buf指向的空间 count:希望读取的字节数
write函数
原型:ssize_t write(int fd,void *buf,size_t count) 头文件:<unistd.h> 功能:向一个打开的文件写入数据,成功返回写入到文件里的字节数,失败返回-1 参数:fd:要写入数据的文件的描述符 buf:要写入的数据的存放位置 count:希望写入的字节数
lseek函数
原型:Off_t lseek(int fd,off_t offset,int whence) 头文件:<sys/types.h><unistd.h> 功能:重新定位文件的读写位置,成功返回移动后的文件指针距离文件头的距离,失败返回-1 参数:fd:需要重新定位的文件的描述符 offset:偏移量 whence:该参数可以取SEEK_SET,SEEK_CUR,SEEK_END. SEEK_SET表示文件指针从文件头偏移offset个字节;SEEK_CUR表示文件指针从当前位置偏移offset个字节;SEEK_END表示文件指针从文件尾偏移offset个字节。
每次打开一个文件都有一个与其关联的“当前文件偏移量”。读写操作都从当前文件偏移量处开始,并使偏移量增加读写的字节数。
dup函数
原型:int dup(int oldfd) 头文件:<unistd.h> 功能:复制一个文件描述符,成功返回新的文件描述符,失败返回-1 参数:oldfd:待复制的老的文件描述符
使用例子
/********************************************** *函数名:test.c *函数功能:复制一个文件的内容到另一文件 ***********************************************/ #include<stdio.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> void main(int argc,char *argv[]) { int fd_s=open(argv[1],O_RDONLY); int fd_t=open(argv[2],O_WRONLY | O_CREAT,0666); int count=1; char buf[512]; while(count>0) { count=read(fd_s,buf,512); write(fd_t,buf,count); } close(fd_s); close(fd_t); }
相关文章推荐
- C++ 输入函数 cin>>、cin.getline()和cin.get()区别
- C++ 读取键盘输入(cin/cin.getline()/cin.get()/cin.clear())
- Java--浅析Java中的final关键字
- Spring核心组件之Bean
- 在myeclipse的java web项目中手动添加jstl的步骤
- php笔记
- JAVA基础一大堆0802集合+泛型
- c#region
- 移植u-boot-2015.07-rc3之修改代码支持NorFlash(四)
- 转Intellij支持Eclipse的代码格式化文件
- java中的工厂模式是什么,请举例说明
- Java集合学习系列之:HashMap的实现原理
- Java中配置文件放在哪里
- laravel Event执行顺序
- 移植u-boot-2015.07-rc3之修改代码支持串口(三)
- Eclipse出现An error has occurred问题解决方案
- Java中的内存泄漏分析说明
- java中的集合
- Java中的内存泄漏分析说明
- python utf8