前一篇说下了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创建一个文件时,我们希望创建文件时就给文件赋上相应的权限,而如果仅仅是打开一个已存在的文件或设备,这个权限就不需要了,其实这里还是没有说到重点.下面通过真实的例子来说说,是怎么一回事
这段代码并没有把open和close的功能表现得很完全,但是基本上就是参数的不同,而产生不同的功能了,多查API.
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.