Linux下C编程入门笔记——文件IO操作(二)

前一篇说下了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创建一个文件时,我们希望创建文件时就给文件赋上相应的权限,而如果仅仅是打开一个已存在的文件或设备,这个权限就不需要了,其实这里还是没有说到重点.下面通过真实的例子来说说,是怎么一回事


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <fcntl.h>
  6. int main(int argc ,char *argv[]){
  7.     int fd;
  8.     if(argc<2){
  9.         puts("please input the open file pathname!/n");
  10.         exit(1);
  11.     }
  12.     
  13.     //如果flag参数里有O_CREAT表示,该文件如果不存在,系统则会创建该文件,该文件的权限由第三个参数决定,此处为0755
  14.     //如果flah参数里没有O_CREAT参数,则第三个参数不起作用.此时,如果要打开的文件不存在,则会报错.
  15.     //所以fd=open(argv[1],O_RDWR|O_TRUNC),仅仅只是打开指定文件
  16.     if((fd=open(argv[1],O_CREAT|O_RDWR|O_TRUNC,0755))<0){
  17.         perror("open file failure!/n");
  18.         exit(1);
  19.     }else{
  20.         printf("open file %d  success!/n",fd);
  21.     }
  22.     close(fd);
  23.     exit(0);
  24.     
  25. }


这段代码并没有把open和close的功能表现得很完全,但是基本上就是参数的不同,而产生不同的功能了,多查API.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值