文件在Linux中是一个非常重要的概念,几乎一切都是文件(引用Linux程序设计/Beginning Linux ProGramming,那么这次主要学习文件读写。
1、系统调用跟库函数调用区别
从实现的角度:系统调用直接对文件和设备进行访问和控制的的一组底层接口, 而标准I/O库为地城I/O调用提供了一个通用的接口,系统调用直接跟底层打交道,系统调用移植性远不如标准I/O库好。
从性能的角度:使用系统调用会影响系统的性能。与库函数调用相比,系统调用的开销要大些,因为在执行系统调用时,Linux必须从运行用户代码切换到执行内核代码,然后再返回用户代码。减少这种开销的一个好办法是,在程序中尽量减少系统调用的次数,并且让每次系统调用完成尽可能多的工作。比如,每次读写大量的数据而不是每次仅读写一个字符。
从代码的角度:系统调用主要使用函数open打开一个文件,然后再返回一个文件描述符,而write、read等系统调用函数再对这个文件描述符进行操作,库函数调用主要使用函数fopen打开一个文件,然后再返回一个指向文件的指针,而fwrite、fread等库函数再对这个指针进行操作。
它们的代码的实现是非常类似的。
关于对文件的总结,我发现这位仁兄已经总结过,非常不错。(内容基本都来自Linux程序设计)
http://www.cnblogs.com/yanlingyin/archive/2012/08/04/2617209.html
那我展现几个常见的例子吧。
2、系统调用例子
2.1、对文件进行写操作。
功能:程序向打开的文件写入字符串“hello world”
/*
* test.c
*
* Created on: 2016年7月17日
* Author: Andy_Cong
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main(int argc,char *argv[])
{
if(argc<2)
return 0;
//用读写追加方式打开一个已经存在的文件
int fd=open(argv[1],O_RDWR|O_APPEND);
if(fd==-1)
{
printf("error is %s\n",strerror(errno));
}
else
{
//打印文件描述符号
printf("success fd = %d\n",fd);
char buf[100];
memset(buf,0,sizeof(buf));
strcpy(buf,"hello world\n");
write(fd,buf,strlen(buf));
close(fd);
}
return 0;
}
运行结果: