open, create, close

1.open函数

说明:

调用open函数打开或者创建一个文件。函数定义如下:

  1. #include <fcntl.h>
  2. int open(const char *pathname, int flag);
  3. int open(const char *pathname, int flag, mode_t mode);//只有新创建文件时才会使用该函数
  4. //返回值,如果成功返回文件描述符,如果出错返回-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 多次,则第一次创建文件,接下来直接打开文件。

[cpp] view plaincopy

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. int main(void){
  4. int fd;
  5. if((fd = open("./a.txt",O_RDONLY|O_CREAT, S_IRUSR))<0){
  6. perror("open");
  7. }
  8. close(fd);
  9. return 0;
  10. }

运行结果:

  1. [email protected]:~/ctest$ ./a.out
  2. [email protected]:~/ctest$ ll a.txt
  3. -r-------- 1 yan yan 0 Jun  5 07:48 a.txt
  4. [email protected]:~/ctest$ ./a.out
  5. [email protected]:~/ctest$ ./a.out

如果同时使用O_CREAT和O_EXCL,并且文件已经存在,则会出错;如果文件不存在,则创建文件,并且这个操作是原子操作。

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. int main(void){
  4. int fd;
  5. if((fd = open("./a.txt",O_RDONLY|O_CREAT|O_EXCL))<0){
  6. perror("open");
  7. }
  8. close(fd);
  9. return 0;
  10. }

运行结果:

[cpp] view plaincopy

  1. [email protected]:~/ctest$ ll a.txt
  2. -rw-rw-r-- 1 yan yan 0 Jun  5 07:55 a.txt
  3. [email protected]:~/ctest$ ./a.out
  4. open: File exists

如果单独使用O_EXCL,并且文件不存在,则会出错;如果文件已经存在,不会报错,也不会创建文件。

[cpp] view plaincopy

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. int main(void){
  4. int fd;
  5. if((fd = open("./a.txt",O_RDONLY|O_CREAT|O_EXCL))<0){
  6. perror("open");
  7. }
  8. close(fd);
  9. return 0;
  10. }

运行结果:

  1. [email protected]virtual-machine:~# ll a.txt
  2. ls: 无法访问a.txt: 没有那个文件或目录
  3. [email protected]virtual-machine:~# ./open
  4. -bash: ./open: 没有那个文件或目录
  5. [email protected]virtual-machine:~# touch a.txt
  6. [email protected]virtual-machine:~# ./a.out
  7. [email protected]virtual-machine:~#

2.creat函数

使用creat函数创建一个新文件,如果原来该文件存在,会将这个文件的长度截短为0。函数定义如下:

  1. #include <fcntl.h>
  2. int creat(const char *pathname, mode_t mode);

如果成功则返回为只写打开的文件描述符,出错则返回-1。

此函数等效于:

  1. open(pathname, O_WRONLY | O_CREAT | O_TRUNC, mode);

后面的mode_t就是ugo的权限(同open函数),注意,如果creat函数创建了一个可读写的文件,但是因为creat只返回可写的
文件描述符,所以使用返回的文件描述符读的时候会出错。例子如下:

//这么冗余?

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. int main(void){
  4. int fd;
  5. if((fd = creat("./a.txt", S_IRUSR|S_IWUSR|S_IXUSR))<0){
  6. perror("creat");
  7. }
  8. char buf[100];
  9. if(read(fd,buf,100) < 0){   //返回的文件描述符不允许读,但是文件的权限还是rwx的
  10. perror("read");
  11. }
  12. close(fd);
  13. return 0;
  14. }

执行结果为:

  1. [email protected]an-vm:~/ctest$ ./a.out
  2. read: Bad file descriptor

如果文件已经存在,再次creat该文件,原来的文件将被删除,重新生成一个空文件。


  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. int main(void){
  4. int fd;
  5. if((fd = creat("./a.txt", S_IRUSR|S_IWUSR|S_IXUSR))<0){
  6. perror("creat");
  7. }
  8. close(fd);
  9. return 0;
  10. }

运行结果:

[email protected]:~# cat a.txt
123
[email protected]:~# ./a.out
[email protected]:~# cat a.txt
[email protected]:~#

3.close函数

close函数关闭一个打开的文件。函数定义如下:

  1. #include <unistd.h> //这边要注意下,open函数定义在fcntl.h文件中,和close不一样。
  2. int close(int filedes);

如果成功返回0,出错返回-1.
关闭一个文件时还会释放该进程加在文件上的所有记录锁。

时间: 2024-10-17 02:02:47

open, create, close的相关文章

[TypeScript] Create random integers in a given range

Learn how to create random integers using JavaScript / TypeScript. /** * Returns a random int between * @param start inclusive * @param before exclusive */ export function randomInt(start: number, before: number) { return start + Math.floor(Math.rand

redis error It was not possible to connect to the redis server(s); to create a disconnected multiplexer, disable AbortOnConnectFail. SocketFailure on PING

应用redis出现如下错误 It was not possible to connect to the redis server(s); to create a disconnected multiplexer, disable AbortOnConnectFail. SocketFailure on PING 参考stack overflow上文章 http://stackoverflow.com/questions/30895507/it-was-not-possible-to-connec

关于hibernate中提示can not create table ******

最近这两天,一直在搞hibernate,被 其中一个问题困扰了好久.在网上找了好久,一直都没有找到可行的方法,把jdk,jre,tomcat,装了拆,拆了装,可就是搞不好.实在是没有办法,又重新建了一个项目来测试,,从一点一滴开始试.所有的代码全部都手写,,,,可是问题依旧还在. 之所以一直没有找到解决办法,其实是自己的思维一直局限在一处,,,一直在想着hibernate只要把配置文件配置好,它就可以自己在数据库创建表结构,自己增删改查,相当的方便,可是自己 当时成功了,为什么这次却一而再再而三

How to Create an OCM Response file to Apply a Patch (文档 ID 966023.1)

How to Create an OCM Response file to Apply a Patch in Silent Mode - opatch silent (文档 ID 966023.1) APPLIES TO: Oracle Universal Installer - Version 10.2.0.1 to 11.2.0.4 [Release 10.2 to 11.2]Oracle Database - Enterprise Edition - Version 10.2.0.1 to

【cl】解决Fail to create the java Virtual Machine

eclipse打开,提示Fail to create the java Virtual Machine 解决方法: 1.到eclipse安装目录下,找到eclipse.ini 2.按键盘ctrl+F,复制以下字符“launcher.XXMaxPermSize”,去掉引号,查找 3.将随后出现的两个216m改成128m

使用Object.create()实现继承

一.常见继承方式 我们日常开发中常见的继承方式主要有: 1.默认模式: Child.prototype = new Parent(); 2.借用构造函数: function Child(a, b, c, d) { Parent.apply(this, arguments); } 3.借用和设置原型: function Child(a, b, c, d) { Parent.apply(this, arguments); } Child.prototype = new Parent(); 4.共享原

win10安装Anaconda3出现failed to create anacoda menue错误的解决方案

其他描述:[Anaconda Prompt找不到][开始菜单没有Anaconda Prompt][Anaconda failed to create anacoda menue][IPython找不到] 环境:windows10, Anaconda3 ( python3.6, 64-bit ) 错误:failed to create anacoda menue 解决思路: 从错误信息看是添加开始菜单的快捷方式失败,因此新建几个快捷方式即可. 解决方案: 重新安装Anaconda,报错后忽略,忽略

python pip fatal error in launcher unable to create process using

用pip安装一个包,不知道为啥,就报了这个错误:python pip fatal error in launcher unable to create process using “” 百度了一下,用下面的命令可以解决,搞定 python2 -m pip install XXX  另外,Python3 的pip我用python3 -m pip install --upgrade pip 搞定

因为发现对象名称 &#39;dbo.T3&#39; 和索引名称 &#39;PK__T3__3214EC2706CC942B&#39; 有重复的键,所以 CREATE UNIQUE INDEX 语句终止。重复的键值为 (1)。

sql语句:ALTER TABLE T3 ADD  PRIMARY KEY (ID); 执行报错: 消息 1505,级别 16,状态 1,第 1 行因为发现对象名称 'dbo.T3' 和索引名称 'PK__T3__3214EC270466E04C' 有重复的键,所以 CREATE UNIQUE INDEX 语句终止.重复的键值为 (1).消息 1750,级别 16,状态 0,第 1 行无法创建约束.请参阅前面的错误消息.语句已终止. 出错原因: 要在ID列上建主键,但id列数据有重复,不唯一.

Visual Studio Create Setup project to deploy web application in IIS

Introduction: In this article I will explain how to create setup file in visual studio 2008/2010 to deploy web application file directly in IIS or in client machine or how to place web application folder in c:\\inetpub\wwwroot folder by running setup