[APUE] 文件 I/O 之 Open/Close

前言

上一篇文章,主要讲了文件描述符的基本知识.这篇,我将会结合代码,对上一节的 open,close函数进行详细的讲解.

代码 Git 地址 SuzhenProjects/ApueProject

常用函数复习

  • open 打开或者创建一个用来读/写的文件
  • read 读取用户指定的 Input
  • write 写入到指定的 Output
  • lseek 重新定位读写游标的位置
  • close 删除(关闭)一个文件描述符

Tips: 通过 man 2 <Command> 可以查询你系统的这些 API 档案

Open 函数 int open(const char *path, int oflag, ...);

  • path 文件的路径,如果文件不存在,则返回错误
  • oflag 打开文件/目录,所使用的用户自定义选项
    • O_RDONLY 只读
    • O_WRONLY 只写
    • O_RDWR 读/写
    • O_NONBLOCK 打开文件时/读取数据时,不要阻塞调用
    • O_APPEND 追加模式,write的内容被追加到文档的末尾
    • O_CREAT 如果文件不存在,open会创建文件
    • O_TRUNC 截断文件,使文件长度为0
    • O_EXCL 存在O_CREAT模式时,如果文件存在,会返回错误
    • O_SHLOCK 自动获取 flock 的共享锁
    • O_EXLOCK 自动获取 flock的独占锁
    • O_NOFOLLOW 打开文件的链接时, 会失败
    • O_SYMLINK 运行打开文件的链接
    • O_EVTONLY 用来监视文件是否有改动
    • O_CLOEXEC 标记为close-on-exec
  • 扩展参数
    • 可以传入文件的权限标志 如 0755,0666
  • 返回值 成功会返回一个正整数,其余均为失败,需要检查errno

Close 函数 int close(int fildes);

  • fildes文件描述符
  • 返回值 成功会返回0,其余均为失败,需要检查errno

Tips: 通过 strerror 可以将 errno 转换成可读的字符串

实战 C++

一般我们使用open打开一个文件或者目录后,必须使用 close进行释放,否则会出现资源泄露.
(这就是很多语言内的 Stream类打开后没有关闭,会导致各种问题的原因之一),所以我们一定要记住Open/Close 总是成对的使用

#include <unistd.h>
#include <fcntl.h>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cerrno>

int main(int argc, char **argv) {
    constexpr char TargetFile[]{"NewFile.txt"};
    int filefd = ::open(TargetFile, O_RDWR | O_CREAT, 0666);
    if (filefd < 0) {
        printf("open failed ! err :%s\n", strerror(errno));
        return 1;
    }
    printf("open success , fd = %d\n", filefd);
    ::close(filefd);
    return EXIT_SUCCESS;
}

实战 Golang

相比C++版本调用的繁琐,Golang 提供了更加人性化的os.OpenFile 函数,该函数有两个返回值.成功时,返回一个文件指针,错误设置为 nil,失败时,文件指针为 nil,此时要读取错误信息,并通知用户.

package main

import (
    "os"
    "fmt"
)

const (
    NewFile = "NewFile.txt"
)

func main() {
    fptr, err := os.OpenFile(NewFile, os.O_RDWR|os.O_CREATE, 0666)
    if err != nil{
        fmt.Println(err.Error())
        return
    }
    fptr.Close()
}

总结

C++版本的看懂后,Golang 版本是不是也一目了然了,每行发生了什么事情,心中都有数了.我们可以做一个类推,Pythonopen,close也一定是这个原理.这些语言封装了更好的异常处理,方便程序员去处理 open,close 发生的问题.最重要的一点是 openclose必须成对的被使用!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容