(一)
linux文件的IO编程应该算是每个入门者最先涉及的,我也不例外。希望通过BLOG的形式,记录下自己每天学习的点点滴滴,我相信滴水穿石,尽管记录的文字都比较简单,对于高手而言抑或没有什么技术含量,但我坚信坚持到最后,就是大牛。
好了,废话说了不少了,开始我的笔记吧。
LINUX下对文件的操作同其它平台系统一样,无外乎创建文件,打开文件,关闭文件,读文件,写文件,拷贝文件,对文件进行权限的控制和管理(这涉及到锁,以后再讨论),另外在这里有一点一定要牢记,那就是在Linux操作系统里,硬件设备也当作文件来对待,我认为这样最大的好处是可以实现文件和设备的统一管理,比如我在上面提到的操作(打开文件,关闭文件,读文件,写文件.....),也通用于硬件设备的操作(打开设备,关闭设备,读设备件,写设备......).明白了这一点,就可以很发挥想象怎么去搞定串口,并口,USB设备........等一系列外围设备了.(是不是很吃惊).
文件IO操作是Linux环境编程基础中的基础.语法和API上看似简单,但真正的应用起来,有时恐怕并不如我最开始想象的那么轻松,所以既然是菜鸟入门,还是要把基础打好.为了让自己找到乐趣和自信,我决定从最简单的函数开始.creat创建文件.
create函数的原型如下:(大家可以查询manpages.chm)
int creat(const char *pathname, mode_t mode);
参数代表的意思,manpages里讲得确实已经非常清楚了.下面我写了一个简单的例子.(这个例子确实是太简单啦,但是养成动手的好习惯会让每一位程序员受益)
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
void create_file(char *filename){
if(creat(filename,0755)<0){
printf("create file %s failure!/n",filename);
exit(EXIT_FAILURE);
}else{
printf("create file %s success!/n",filename);
}
}
int main(int argc,char *argv[]){
int i;
if(argc<2){
perror("you haven't input the filename,please try again!/n");
exit(EXIT_FAILURE);
}
for(i=1;i<argc;i++){
create_file(argv[i]);
}
exit(EXIT_SUCCESS);
}
这个例子没有太多要说的了,但还是想啰嗦一下,创建文件时,脑海里为何飘出一个0755,这是文件的读写执行权限,就是RWX和4 2 1码的对应关系相加,manpages里也有详细说明
运行的结果如下:
[hacker@localhost Project]$ ./create temp1 temp2
create file temp1 success!
create file temp2 success!
(二)
前一篇说下了creat创建文件,后来我突发其想,creat能不能创建设备呢?创建实实在在的硬件设备当然是不可能的了,能不能创建逻辑设备呢,希望有高手能帮我回答这个问题.QQ:262482485在此不胜感激. 这里再来说一下,打开文件和关闭文件的操作open,打开manpages查找open,发现open有两个函数原型,只是参数的个数不一样,在JAVA中这叫重载,原型如下:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
哦,对了,前一篇我忘了讲了,其实open同样有创建文件的功能,利用其参数就能实现,creat仅仅是创建一个文件,而open不仅可以创建文件,创建文件后会把所创建的文件直接打开,方便后续操作.
这里有几点可以思考,当我们要创建一个文件时,然后对文件进行相关读写操作时,我们是用creat还是open? 这不废话吗? 当然是用open一步到位啦,省得创建了文件再来调用open.另外creat和open在执行完之后分别返回些什么,让我们知道执行的结果如何? 这里我们要先了解另外一个概念,文件描述符,如果不清楚,先去翻翻教材,我在这种里简单地将文件描述符理解为,linux系统中,对文件的唯一标识,我们在编程时通常这么定义这个变量int fd;fd一看就明白了吧,只要你英语不是白痴,file descriptor. 是int类型的,如果open和creat一个文件成功的话,就会返回此文件的描述符是一个大于0的整数.所以当我们调用open和creat之后我们可以根据其返回值是否大于0判断执行是否OK,如是不OK,就错误处理或搞其它的操作也行,随你便了.
刚才列出了open的两个不同的函数原型,也说到了open有创建文件的功能,这里可以一起发出两个疑问,为什么open要有两个函数实现?如何用open来创建文件呢?
能产生这两个疑问真是太好了.比较下那两个open的原型,发现只是多了一个mode_t类型的参数啊.前一篇其实用过mode_t这个参数了,我当时头脑发热给创建的文件,设置mode_t的值为0755 ,就是RWX权限.你可以继续思考,为什么打开一个文件时,一个需要权限参数,一个不需要呢,谜底终于被你揭开了.因为当我们用open创建一个文件时,我们希望创建文件时就给文件赋上相应的权限,而如果仅仅是打开一个已存在的文件或设备,这个权限就不需要了,其实这里还是没有说到重点.下面通过真实的例子来说说,是怎么一回事
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc ,char *argv[]){
int fd;
if(argc<2){
puts("please input the open file pathname!/n");
exit(1);
}
//如果flag参数里有O_CREAT表示,该文件如果不存在,系统则会创建该文件,该文件的权限由第三个参数决定,此处为0755
//如果flah参数里没有O_CREAT参数,则第三个参数不起作用.此时,如果要打开的文件不存在,则会报错.
//所以fd=open(argv[1],O_RDWR|O_TRUNC),仅仅只是打开指定文件
if((fd=open(argv[1],O_CREAT|O_RDWR|O_TRUNC,0755))<0){
perror("open file failure!/n");
exit(1);
}else{
printf("open file %d success!/n",fd);
}
close(fd);
exit(0);
}
这段代码并没有把open和close的功能表现得很完全,但是基本上就是参数的不同,而产生不同的功能了,多查API.