《UNIX环境高级编程》笔记--open函数,create函数,close函数
来源:互联网 发布:欧洲 旅游 大学生 知乎 编辑:程序博客网 时间:2024/05/22 17:34
1.open函数
#include <fcntl.h>int open(const char *pathname, int flag);int open(const char *pathname, int flag, mode_t mode);//只有新创建文件时才会使用该函数//返回值,如果成功返回文件描述符,如果出错返回-1使用open返回的文件描述符作为参数传递给write或read,按照惯例,UNIX中文件描述符0与标准输入相关联,文件描述
符1与标准输出相关联,文件描述符2与标准出错输出相关联。依照POSIX标准,0、1、2通常被替换成符号常量STDIN_FILENO、
STDOUT_FILENO、STDERR_FILENO(定义在头文件unistd.h中)。文件描述符的范围为0~OPEN_MAX。
pathname为文件的绝对路径或相对路径。
flag用于指定文件的打开/创建模式,这3个常量定义在fcntl.h中,这3个参数是必选的,而且只能选择一个:
O_RDONLY 只读模式
O_WRONLY 只写模式
O_RDWR 读写模式
下面的常量是可选的:
O_APPEND 每次写操作都写入文件的末尾。
O_CREAT 如果指定文件不存在,则创建这个文件。如果存在则直接打开文件。如果创建新文件,而mode参数没有指定,
则创建的文件权限不定。
O_EXCL 如果文件不存在,则返回错误。如果同时指定了O_CREAT,而文件已经存在,则会出错。 用此测试一个文件
是否存在,如果不存在,则创建此文件。
O_TRUNC 如果文件存在,并且以只写/读写方式打开,则清空文件全部内容。
O_NOCTTY 如果路径名指向终端设备,不要把这个设备用作控制终端。
O_NONBLOCK 如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O设置为非阻塞模式(nonblocking mode)。
下面三个标志也是可选的,他们是Single UNIX Specification中同步输入和输出选项的一部分:
O_DSYNC 等待物理 I/O 结束后再 write。在不影响读取新写入的数据的前提下,不等待文件属性更新。
O_RSYNC read 等待所有写入同一区域的写操作完成后再进行。
O_SYNC 等待物理 I/O 结束后再 write,包括更新文件属性的 I/O。
可选参数可以和必选参数一起使用,并且可以使用多个,如果要以读写方式打开一个文件,如果该文件已经存在,则
将文件清空,如果没有存在,则新创建文件,flag应该为:O_WRONLY | O_CREAT | O_TRUNC
mode用于在创建新文件时指定文件的权限,参数的:
实践:
如果使用O_CREAT 多次,则第一次创建文件,接下来直接打开文件。
#include <stdio.h>#include <fcntl.h>int main(void){ int fd; if((fd = open("./a.txt",O_RDONLY|O_CREAT, S_IRUSR))<0){ perror("open"); } close(fd); return 0;}
运行结果:
yan@yan-vm:~/ctest$ ./a.outyan@yan-vm:~/ctest$ ll a.txt-r-------- 1 yan yan 0 Jun 5 07:48 a.txtyan@yan-vm:~/ctest$ ./a.outyan@yan-vm:~/ctest$ ./a.out
如果同时使用O_CREAT和O_EXCL,并且文件已经存在,则会出错;如果文件不存在,则创建文件,并且这个操作时原子操作。
#include <stdio.h>#include <fcntl.h>int main(void){ int fd; if((fd = open("./a.txt",O_RDONLY|O_CREAT|O_EXCL))<0){ perror("open"); } close(fd); return 0;}运行结果:
yan@yan-vm:~/ctest$ ll a.txt-rw-rw-r-- 1 yan yan 0 Jun 5 07:55 a.txtyan@yan-vm:~/ctest$ ./a.outopen: File exists
如果单独使用O_EXCL,并且文件不存在,则会出错;如果文件已经存在,不会报错,也不会创建文件。
#include <stdio.h>#include <fcntl.h>int main(void){ int fd; if((fd = open("./a.txt",O_RDONLY|O_CREAT|O_EXCL))<0){ perror("open"); } close(fd); return 0;}
运行结果:
root@yan-virtual-machine:~# ll a.txtls: 无法访问a.txt: 没有那个文件或目录root@yan-virtual-machine:~# ./open-bash: ./open: 没有那个文件或目录root@yan-virtual-machine:~# touch a.txtroot@yan-virtual-machine:~# ./a.outroot@yan-virtual-machine:~#
2.creat函数
使用creat函数创建一个新文件,如果原来该文件存在,会将这个文件的长度截短为0。函数定义如下:#include <fcntl.h>int creat(const char *pathname, mode_t mode);如果成功则返回为只写打开的文件描述符,出错则返回-1。
此函数等效于:
open(pathname, O_WRONLY | O_CREAT | O_TRUNC, mode);后面的mode_t就是ugo的权限(同open函数),注意,如果creat函数创建了一个可读写的文件,但是因为creat只返回可写的
文件描述符,所以使用返回的文件描述符读的时候会出错。例子如下:
#include <stdio.h>#include <fcntl.h>int main(void){ int fd; if((fd = creat("./a.txt", S_IRUSR|S_IWUSR|S_IXUSR))<0){ perror("creat"); } char buf[100]; if(read(fd,buf,100) < 0){ perror("read"); } close(fd); return 0;}执行结果为:
yan@yan-vm:~/ctest$ ./a.outread: Bad file descriptor
如果文件已经存在,再次creat该文件,原来的文件将被删除,重新生成一个空文件。
#include <stdio.h>#include <fcntl.h>int main(void){ int fd; if((fd = creat("./a.txt", S_IRUSR|S_IWUSR|S_IXUSR))<0){ perror("creat"); } close(fd); return 0;}运行结果:
root@virtual-machine:~# cat a.txt
123
root@virtual-machine:~# ./a.out
root@virtual-machine:~# cat a.txt
root@virtual-machine:~#
3.close函数
close函数关闭一个打开的文件。函数定义如下:#include <unistd.h> //这边要注意下,open函数定义在fcntl.h文件中,和close不一样。int close(int filedes);如果成功返回0,出错返回-1.
关闭一个文件时还会释放该进程加在文件上的所有记录锁。
- 《UNIX环境高级编程》笔记--open函数,create函数,close函数
- 《UNIX环境高级编程》笔记--open函数,create函数,close函数
- 《UNIX环境高级编程》笔记4--open函数,create函数,close函数
- 笔记3-1: open/close/create 函数
- open函数,create函数,close函数
- 《UNIX环境高级编程》笔记--fcntl函数
- 《UNIX环境高级编程》笔记--access函数
- 《UNIX环境高级编程》笔记--umask函数
- 《UNIX环境高级编程》笔记--system函数
- 《UNIX环境高级编程》笔记--sigaction函数
- 《UNIX环境高级编程》笔记--sigsuspend函数
- 《UNIX环境高级编程》笔记--sigsuspend函数
- 《UNIX环境高级编程》笔记--sigsuspend函数
- 《UNIX环境高级编程》笔记--chmod函数和fchmod函数
- 《UNIX环境高级编程》笔记--kill函数,raise函数,alarm函数,pause函数
- 《UNIX环境高级编程》笔记--sync、fsync和fdatasync函数
- 《UNIX环境高级编程》笔记--chown,fchown和lchown函数
- 《UNIX环境高级编程》笔记--getrlimit和setrlimit函数
- 做一个弹出视图框的例子,点击一个按钮,弹出一个视图框[转]
- C/C++文件IO读写
- 参考资料写的linux块设备驱动,可以nmod和mkfs.ext3,但是不知道为什么加载不了
- mac os xcode app 自动注册开启自动启动
- CSU 1317 Find the max Link
- 《UNIX环境高级编程》笔记--open函数,create函数,close函数
- Android中设置控件可见与不可见详解
- android fragment android.support.v4.app.Fragment与android.app.Fragment区别
- emgu cv 在WPF上显示图像
- Silverlight 之 image source 绑定
- 感谢他们,但除了感谢我实在不可能对他们有其他的感觉了,就像我
- Asp.Net MVC 路由
- ios开发适配3.5寸和4寸屏幕
- ZOJ1109-map与string