APUE 学习之旅

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

2018-01-04  本文已影响0人  疯狂的攻城狮

前言

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

代码 Git 地址 SuzhenProjects/ApueProject

常用函数复习

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

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

Close 函数 int close(int fildes);

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必须成对的被使用!!!

上一篇下一篇

猜你喜欢

热点阅读