浅析open、close函数

在了解open函数之前想看看系统调用和文件描述符的概念;
系统调用:系统调用是操作系统为用户态运行的进程与硬件设备(CPU,磁盘,打印机等)进行交互提供的一组接口函数。
文件描述符:对于内核而言,所有打开的设备,文件,网络socket都是通过文件描述符引用,文件描述符是一个非负整数。当打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。当读写一个文件时,使用open或creat返回的文件描述符标识该文件,将其作为系统调用的接口函数的参数。如read,write,ioctl等。
程序运行的时候,系统会默认为该进程打开三个文件描述符:
      标准输入:STDIN_FILENO(0)
      标准输出:STDOUT_FILENO(1)
      标注出错:STDERR_FILENO(2)

1.open函数
现在来看open函数,该函数的原型为:
int open(const char *path, int oflag, ... /*mode_t mode*/);
open系统调用返回的文件描述符一定是最小,未使用的文件描述符数值。
参数:
path:要打开文件的路径名以及设备名
oflag:由多个选项进行或运算构造oflag参数
          必选:    O_RDONLY (只读)、 O_WRONLY(只写)、 O_RDWR( 读写)
可选: O_APPEND 每次写时都追加到文件的尾端。
O_CREAT 文件不存在则创建它, 使用该选项需要第三个参数mode
O_NONBLOCK 如果path是一个FIFO、 块设备、 字符特殊文件则此选项为文件的本次打开和后续的I/O操作设置非阻塞模式方式。
O_TRUNC 如果文件存在, 而且为只写或读写成功打开, 则将其长度截取为0;
O_EXEC、 O_SEARCH、 O_CLOEXEC、 O_NOCTTY....
mode: oflag带O_CREAT选项时, 必须带该参数用来指定打开文件的权限模式, 如777。
例: int fd; fd = open(“text.txt”, O_RDWR|O_CREAT|O_TRUNC, 0666);
       fd = open(“text.txt”, O_WRONLY|O_APPEND);

2.close函数
与open函数相对应的是close函数,其原型为 int close(int fd)
该函数用来关闭一个打开的文件, 关闭一个文件时还会释放该进程加在该文件 上的所有记录锁。 当一个进程终止时, 内核自动关闭它所有打开的文件。

3.系统调用出错
绝大部分linux系统调用返回值都是0表示成功,-1表示失败。库函数中有个整形类型的errno变量,每个errno值对应着以字符串表示的错误类型如果系统调用出错,该函数重新设置errno的值,通过该值我们可以知道系统调用具体的出错原因。
perrno()用来将上一个函数发生错误的原因输出到标准出错上,参数s指向的字符串会先打印出来,后面加上错误原因字符串。此错误原因依照全局变量errno的值来决定要输出的字符串。
strerror通过标准错误的标号, 获得错误的描述字符串 , 将单纯的错误标号转为字符串描述, 方便用户查找错误。

/*********************************************************************************
 *      Copyright:  (C) 2017 SCUEC
 *                  All rights reserved.
 *
 *       Filename:  open.c
 *    Description:  This file
 *
 *        Version:  1.0.0(03/26/17)
 *         Author:  LI WJNG 
 *      ChangeLog:  1, Release initial version on "03/26/17 10:27:55"
 *
 ********************************************************************************/
#include 
#include 
#include 
#include 
#include 

/********************************************************************************
 *  Description:
 *   Input Args:
 *  Output Args:
 * Return Value:
 ********************************************************************************/
int main (int argc, char **argv)
{
    int fd = -1;
    char buf[1024];
    fd = open("file.text",O_RDWR|O_CREAT|O_TRUNC);
    if(fd<0)
    {
        perror("Open failure");
        printf("Open %s failure[%d]%s\n","file.text",errno,strerror(errno));
        return ;
    }
    write(fd,"HELLO",5);
    memset(buf,0,sizeof(buf));
    read(fd,buf,sizeof(buf));
    printf("file content:%s\n",buf);
    close(fd);
    return 0;
} /* ----- End of main() ----- */

该函数实现的功能为:1.打开当前目录下的file.text文件,如果没有该文件就创建该文件。
                                         2.打开该文件后向该文件写入 "HELLO" 字符串
                                         3.将buf数组里面的内容清空并显示(当然什么都不会有显示)
结果:
浅析open、close函数_第1张图片

你可能感兴趣的:(linux学习笔记,C语言杂谈)