ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Linux系统编程001--系统IO

2022-09-14 18:34:39  阅读:230  来源: 互联网

标签:文件 struct -- int 001 fd IO include open


1. 文件系统:用来存储、组织、管理文件的一套方式、协议

2. 文件

  • 文件的属性:i-node唯一表示一个文件的存在与否
  • 文件的内容

3. Linux系统如何实现文件的操作?

硬件层:
    inode(属性)--->文件的内容
Linux内核:
    struct inode{}用来描述一个文件的屋里inode的信息【链表保存】,系统识别到一个文件的存在,
    就会为它创建一个struct inode,一个文件只会唯一对应一个struct inode

    struct file{}用来描述一个已经打开的文件:
        文件状态标记(如:O_RDONLY、O_WRONLY......)
        文件的偏移量/offset(类似“光标”)

    struct inode*
        每一个打开的文件都会对应一个struct file
        一个文件可以被多个不同的进程打开,一个进程也可以打开多个文件

    操作文件的过程:
        struct file---> struct inode--->硬件上面的inode--->文件的内容
        linux为了屏蔽文件操作的具体细节,为每一个进程创建一个“进程文件表项”,
        保存每一个进程打开的文件的 struct file* 的数组
        struct file*fds[]
            0  struct file*--->struct inode......
            1  struct file*--->struct inode......
            ......

    linux再提供操作文件的函数接口:
        fd = open()
        打开一个指定的文件,返回“进程文件表项”的下标,
        int  "文件描述符":在linux应用中,用来描述一个已经打开的文件,每一个打开的文件都有有个唯一的id,
                            后续操作这个文件,都是通过这个id操作该文件
        read(fd)
        write(fd)
        close(fd)
        ......
    linux系统提供的这些用于操作文件的接口函数(open,read.....),我们称为“系统IO”
    系统IO:操作系统提供的对文件的输入输出的接口

4. Linux系统IO的使用

文件的操作步骤

  • 打开文件 open()
NAME
    open, openat, creat - open and possibly create a file
    打开或者创建(创建并打开)一个文件
SYNOPSIS
    #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_RDONLY:只读
            O_WRONLY:只写
            O_RDWR:读写
            以上三个标记只能选一个(文件的打开方式)
            O_APPEND:追加标记,打开文件后,文件的偏移量会在文件的末尾。(默认情况下,读和写的标记在文件的开头)
            O_CREAT:创建标记,如果不存在,则创建文件
            O_EXCL:该标记一般和O_CREAT配合使用,用来测试文件是否存在
                    如果指定O_CREAT | O_EXCL,并且文件存在,则open会失败,并且errno设置为EEXIST,表示文件已存在
            O_TRUNC:truncate  截短,清除文件内容
            O_NONBLOCK:非阻塞方式打开文件
                        非阻塞:不等待
                        如果文件没有内容,read不会等待,直接返回一个错误
                        如果文件没有空间了,write不会阻塞,直接返回一个错误
                        阻塞:等待
                        如果文件没有内容,read会等待(直到有数据或出错)
                        如果文件没有空间了,write会阻塞,(直到有空间或出错)
                        。。。。。。
            多个标记使用“|”链接(标记是使用位域实现的)
            O_RDWR | O_CREAT | O_TRUNC
        mode:指定创建的文件的权限,当第二个参数带有O_CREAT时,指定创建的文件的权限
        返回值:成功打开一个文件,返回打开文件的文件描述符(>2 && int(下标))
        	  操作系统会自动为每一个进程打开三个文件:
        	  标准输入文件:文件描述符 STDIN_FILENO (0)
        	  标准输出文件:文件描述符 STDOUT_FILENO (1)
        	  标准出错文件:文件描述符 STDERR_FILENO (2)
        	  失败返回-1,同时errno被设置
     errno是一个全局变量,是用来保存最后一个出错的错误码
         头文件: #include<srrno.h>
         路径:/usr/include/errno.h
         perror 把错误码对应的错误字符串打印出来
         perro("user indi");
            user indi:用户自己的提示信息
        	打印出来的形式:用户自己的提示信息:系统错误码的提示信息
    int creat(const char *pathname, mode_t mode);
//open.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char argv*[])
{
    //打开文件
	int fd=open(argv[1],O_RDWR, 0666);
    if(-1 == fd)
    {
        printf("open %s error\n",argv[1]);
        //解析errno
        perror("open error");
        return -1;
    }
	peintf("open success\n");
    peintf("fd = %d\n",fd);
    //关闭文件
    close(fd)q;
    retrun 0;
}
  • 对文件的操作(读、写...)
  • 关闭文件
NAME
    close - close a file descriptor
SYNOPSIS
    #include <unistd.h>

    int close(int fd);
        close是用来关闭fd指定的文件
        fd:file descriptor 文件描述符
        返回值:
            成功:返回0
            失败:返回-1,同时errno被设置

 

标签:文件,struct,--,int,001,fd,IO,include,open
来源: https://www.cnblogs.com/emolife/p/16694090.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有