免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2233 | 回复: 1
打印 上一主题 下一主题

Linux 下的文件操作 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-27 10:01 |只看该作者 |倒序浏览
 1. 使用系统调用Linux提供了一些系统调用(System Call) 来进行文件操作,包括:open, read, write, close, lseek, ioctl, etc. (PS:系统调用可以使用汇编语言调用)
  其他所有系统调用都定义在 unistd.h 中,只有open找不到,用下面的代码试了一下:
  view plain int main(){ int fd;fd = open("file.c", 2);printf("file descriptor is : %d.\n", fd);return 0;}
  GCC(4.6.1)直接编译通过,只给了个warning: implicit declaration of function 'open', 奇怪的是printf也不用头文件,程序运行正常。哪位大侠知道指点下吧:)
  open的原型定义为:view plain int open (const char *filename, int flags[, mode_t mode])
  其中第二个参数常用的有:O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, 都在 fcntl.h 中定义为宏, 大家不要像上面例子中那样传参。第三个参数可选,只有在创建文件的时候(第二个参数有O_CREAT)才有用。给个例子:view plain open ("myfile", O_CREAT, S_IRUSR|S_IXUSR|S_IROTH);
  创建并打开文件myfile,设置权限为自己可读可执行(S_IRUSR|S_IXUSR),其他人可读(S_IROTH)。
  参数很多,我也没用全,大家在自己使用的时候慢慢摸索吧,这里略了。
  2. 使用库函数文件操作除了使用系统调用,还可以使用编程语言提供的库函数(library function)。比如C的标准输入输出库:stdio.h 提供了以下一些函数:fopen, fread, fwrite, fclose, fflush fseek, etc. (PS: 其实汇编也可以调用这些函数)
  这些库函数是更高级的抽象,使用了流(stream)的概念,内部使用了缓存,所以虽然库函数最终还是使用了系统调用实现自己的功能,但是比我们自己直接使用系统调用要方便,也要更高效。写起来方便写写就知道了,为什么调用起来效率低呢?写个测试也可以比出来,究其原因是因为系统调用是内核态的函数,每次调用内核都要从用户态切到内核态,更主要的是库函数内部的缓存,可以减少系统调用的次数,同样100次输出,写成系统调用就是赤裸裸的100次系统调用,相当慢;而写成库函数就可能被内部缓存保存起来调用一次系统调用输出,一次哦,效率当然也就快了。
  但是一些特殊情况下只能使用系统调用,比如编写驱动程序,使用特殊的输入输出控制等等。
  最后给个库函数打开文件的例子:
  view plain FILE *in;in = fopen("file.in", "r");
  以只读方式打开名为 file.in 的文件。fopen的声明如下:view plain FILE *fopen(const char *filename, const char *mode);返回一个FILE的指针,FILE是个结构体,stdio.h里面有个声明:
  view plain /* Define outside of namespace so the C++ is happy.  */ struct _IO_FILE;
  typedef struct _IO_FILE FILE;
  注释很欢乐,真正的结构体_IO_FILE定义在libio.h 里面,感兴趣可以自己去看看。
  其中mode可以为:
  "r" or "rb": Open for reading only
  "w" or "wb": Open for writing, truncate to zero length
  "a" or "ab": Open for writing, append to end of file
  "r+" or "rb+" or "r+b": Open for update (reading and writing)
  "w+" or "wb+" or "w+b": Open for update, truncate to zero length
  "a+" or "ab+" or "a+b": Open for update, append to end of file
  b表示打开一个二进制文件(binary file)。缺省则打开文本文件。

论坛徽章:
0
2 [报告]
发表于 2012-01-26 19:45 |只看该作者
谢谢分享。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP