文档章节

文件IO操作原理(01)——open函数

乌合之众
 乌合之众
发布于 2014/11/18 14:13
字数 518
阅读 23
收藏 1

1、open函数

 

open函数用于打开一个文件。

  • #include <sys/types.h>
  • #include <sys/stat.h>
  • #include <fcntl.h>
  • int open(const char *pathname, int flags);
  • int open(const char *pathname, int flags, mode_t mode);

pathname:文件路径和文件名

flags:读写操作标志位(O_WRONLY 只写,O_RDONLY 只读,O_RDWR读写,O_APPEND 追加,O_CREAT创建,O_TRUNC文件存在时截断为0,O_NONBLOCK非阻塞模式)

mode:创建文件的时候,设置umask值(权限位)

open函数是用来打开一个文件的函数,其返回值是一个整数(文件描述符)。linux/Unix下每个程序默认打开了三个文件,分别是STDIN_FILENO(标准输入流文件)、STDOUT_FILENO(标准输出流文件)、STDERR_FILENO(标准错误流文件)。每个文件流都具有一个8K大小的缓冲区。这三个文件的文件描述符分别为0、1、2。每次打开文件,为打开的文件分配的文件描述符都是当前文件描述符表中的最小未分配的整数。

文件描述符表是什么呢?文件描述符表是程序中打开文件的一张记录表。其是一个键值对形式的存在。文件描述符这个整数就是键,值就是指向的实际的文件。(并不是这么简单的,要分析文件系统的时候才便于深入了解)

以写方式打开一个文件代码

 

   1: #include <stdio.h>
   2: #include <unistd.h>
   3: #include <stdlib.h>
   4: #include <sys/stat.h>
   5: #include <sys/types.h>
   6: #include <fcntl.h>
   7: #include <string.h>
   8: #include <errno.h>
   9:  
  10: int main(int argc,char* argv[])
  11: {
  12:     if(argc<2){
  13:         printf("Not input filename");
  14:         exit(1);
  15:     }
  16:     int fd=open(argv[1],O_WRONLY | O_APPEND);
  17:     //打开文件成功否?
  18:     if(fd<0){
  19:         perror("open file fail ");
  20:         exit(0); 
  21:     }
  22:     //读取STDIN_FILENO到文件
  23:     char buf[1024]={0};
  24:     int len=0;
  25:     while(1){
  26:         len=read(STDIN_FILENO,buf,1024);
  27:         if(len<0){
  28:             perror("read STDIO_FILENO fail ");
  29:             exit(1);
  30:         }
  31:         //len-1,会读取换行符
  32:         if(strncmp(buf,"exit",len-1)){
  33:             //puts(buf);
  34:             write(fd,buf,len);
  35:         }else{  
  36:             puts("program exit");
  37:             break;
  38:         }
  39:     }
  40:  
  41:     close(fd);
  42:     return 0;
  43: }

© 著作权归作者所有

乌合之众
粉丝 14
博文 90
码字总数 79438
作品 1
海淀
程序员
私信 提问
来客电商

来客电商 项目介绍 非常惭愧地说,最开始是完全模仿着拼多多的功能模块来做这套系统,也仅仅是为了磨合团队,提高业务水平而已。 可谁知道,做完了拼团基本功能,还发现有评价没有做,好吧,...

沐零
2018/09/10
0
0
周公51CTO博客有价值文章整理

说明:为方便朋友们查看本博客的文章,特地整理了本博客中周公认为值得一看的文章,不过有些文章因为年代久远且技术更新快的原因,里面所讲述的方法或者理论不再适合,请大家斟酌。 asp.net ...

周金桥
2018/06/29
0
0
C++ 跨平台多功能扩展库 - cpgf

cpgf 可为C++代码增加反射(元数据)、序列化、以及Luau和Python脚本绑定等功能,且不依赖任何外部工具。 cpgf 的目标是扩展C++语言,其中包含许多易于使用的功能,这些功能仅在其他更高级别...

wqking
2018/09/17
0
0
ECSHOP_jquery兼容方案

ecshop把AJAX事件和JSON解析的模块放在common/transport.js之中,可以说它也有自己封装的一套工具,这其实是很正常的。 但恰恰的,在封装JSON各种方法的同时对object的模型进行了重写,这个就...

喵王不瞌睡
2014/07/09
0
0
项目协作管理--Mingle

Mingle 是关于项目的协作管理(非开源软件)。Mingle的独特之处以及它在敏捷项目管理和团队协作方面的强大功能包括: Mingle并不局限于敏捷方法论——它默认提供了三种软件开发模版(Scrum, ...

匿名
2008/11/10
6.9K
0

没有更多内容

加载失败,请刷新页面

加载更多

Protocol Buffers 简介

文档编辑和持续集成状态: 本文档的 Protocol Buffer 的中文文档使用的是 Asciidoctor 进行编排的 http://docs.ossez.com/protocol-buffers-docs/index.html(本 WIKI 中的内容将会与在线发布...

honeymoose
今天
4
0
uniapp + bootstrapvue 移动/PC 一套搞定 (一)配置bootstrapvue

1.准备文件 自己到DCloud官网: http://dcloud.io/ 去下载官方的IDE Hbuilder,新建一个空的uniapp项目即可。 uniapp框架自带优化的vue,我们仅仅需要准备以下三个文件: bootstrap.min.css ...

panyunxing
今天
13
0
Android Camera原理之camera service类与接口关系

camera service主要是指 frameworks/av/services/camera/下面的代码,最近在看这一块的代码,为了更好地理清这一块的代码,也为了后续学习camera方便一些,我觉得很有必要理一下这一块的整体...

天王盖地虎626
今天
6
0
Golang学习笔记

[TOC] Golang学习笔记 这个学习笔记是最早在1.初,版本左右的时候写的,和当前最新的版本可能会有较大的差异. 因为成文比较早,文章里面又有很多自己的见解,有些东西当时理解的不太透彻可能写错...

我爱吃炒鸡
今天
21
0
科技赋能成效显著!金融壹账通两大赋能项目荣获IDC大奖

7月19日,2019IDC中国未来金融论坛曁颁奖典礼于北京举办。由金融壹账通赋能的长春农商银行多人视频面审智能风控系统、包头农商银行互联网银行SaaS服务两大项目因在项目的创新性、技术领先性、...

IFTNews
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部