IO线程,文件IO(open),文件(stat)与目录(opendir)属性的读取

news/2024/11/8 18:51:06/

      一、文件IO

1、文件io通过系统调用来操作文件

系统调用:系统提供给用户的一组API(接口函数)

        open/read/write/close/lseek...

用户空间进程访问内核的接口

把用户从底层的硬件编程中解放出来

极大的提高了系统的安全性

使用户程序具有可移植性(同一系统下)

是操作系统的一部分

文件io没有缓存区概念

文件io操作文件的方式:通过文件描述符

shell默认打开了三个文件:

标准输入  标准输出 标准错误

stdin stdout  stderr                  用流来表示

      0         1       2                   用文件描述符表示

2、文件IO相关函数

       1、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_RDONLY:只读

                     O_WRONLY:只写

                     O_RDWR:可读可写

                     这三个宏互斥(三选一)

                     O_CREAT:如果文件不存在,则创建文件,此时用到open函数的第二种形式。

                     O_TRUNC:如果文件存在则清空文件的内容。

                     O_APPEND:以追加的方式打开文件。

                    

       mode:文件的权限,八进制(0777)

       返回值

              成功返回一个新的文件描述符,失败返回(-1)并设置错误号。

       2、close函数

       作用:

              关闭文件

       头文件

          #include <unistd.h>

       函数原型

              int close(int fd);

       参数

        想要关闭的文件描述符

       返回值

              成功返回0,失败返回(-1)并设置错误号。

       3、read/write

        1、read

              作用:

                     向文件读取内容

           头文件:

            #include <unistd.h>

              函数原型

                ssize_t read(int fd, void *buf, size_t count);

              参数

                     fd:想要操作的文件描述符

                     buf:读取到的内容放到哪个地址

                     count:读取到的文件中的字符数量

              返回值:

              成功返回已经读取到的字节数,失败返回-1并设置错误号,读取到文件末尾返回0。

        2、write

              作用:

                     向文件写入内容

           头文件:

            #include <unistd.h>

              函数原型

                ssize_t write(int fd, void *buf, size_t count);

              参数

                     fd:想要写入的文件描述符

                     buf:需要写入文件的内容

                     count:写入文件中字符数量

              返回值:

                     成功返回已经写入的字节数,失败返回-1并设置错误号。

       4、lseek

              作用:

                     偏移文件内的书签

           头文件:

            #include <sys/types.h>

              函数原型

                off_t lseek(int fd, off_t offset, int whence);

              参数

                     fd:想要写入的文件描述符

                     offset:偏移量,正数表示后偏移,负数前偏移,0不偏移

                     whence:书签偏移的起始位置

                                   SEEK_SET:文件头

                                   SEEK_CUR:当前位置

                                   SEEK_END:文件末尾

              返回值:

                     成功返回当前偏移到的位置,失败返回-1并设置错误号。

      二、文件和目录

1、stat

       #include <sys/types.h>

       #include <sys/stat.h>

       #include <unistd.h>

int stat(const char *pathname, struct stat *statbuf);

int fstat(int fd, struct stat *statbuf);

int lstat(const char *pathname, struct stat *statbuf);

stat,lstat通过传入的pathname获取文件属性

fstat通过用open打开的文件的文件描述符获取文件属性

stat在操作软链接文件时会获取源文件的相关属性

lstat在操作软链接文件时会获取链接文件的相关属性

成功返回0,失败返回-1,并设置错误号

相关结构体

struct stat {

               dev_t     st_dev;         /* ID of device containing file */

               ino_t     st_ino;         /* Inode number */

               mode_t    st_mode;        /* File type and mode */

               nlink_t   st_nlink;       /* Number of hard links */

               uid_t     st_uid;         /* User ID of owner */

               gid_t     st_gid;         /* Group ID of owner */

               dev_t     st_rdev;        /* Device ID (if special file) */

               off_t     st_size;        /* Total size, in bytes */

               blksize_t st_blksize;     /* Block size for filesystem I/O */

               blkcnt_t  st_blocks;      /* Number of 512B blocks allocated */

                                   /* Since Linux 2.6, the kernel supports nanosecond

                  precision for the following timestamp fields.

                  For the details before Linux 2.6, see NOTES. */

               struct timespec st_atim;  /* Time of last access */

               struct timespec st_mtim;  /* Time of last modification */

               struct timespec st_ctim;  /* Time of last status change */

           #define st_atime st_atim.tv_sec      /* Backward compatibility */

           #define st_mtime st_mtim.tv_sec

           #define st_ctime st_ctim.tv_sec

           };

1、文件类型(可以用以下的宏确定文件类型,这些宏的参数都是struct stat结构中的ts_mode成员)

S_ISREG(m)  is it a regular file?

S_ISDIR(m)  directory?

S_ISCHR(m)  character device?

S_ISBLK(m)  block device?

S_ISFIFO(m) FIFO (named pipe)?

S_ISLNK(m)  symbolic link? (Not in POSIX.1-1996.)

S_ISSOCK(m) socket? (Not in POSIX.1-1996.)

2、文件权限

       存放在st_mode低9位,从高位到低位分别表示用户权限、同组用户权限、其它用户权限,该位为1表示有权限,0表示没有权限

3、链接数

直接通过st_nlink得到

4、文件所有者

getpwuid函数相关操作得到

5、文件所属组

getgrgid函数相关操作得到

6、文件字节大小

直接通过st_size得到

7、文件更新时间

ctime(&st_ctime)得到文件的更新时间

#include <stdio.h>
#include <sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<string.h>
#include<pwd.h>
#include<grp.h>
#include<time.h>
int main(int argc, char *argv[])
{if(2!=argc){printf("error\n");}struct stat st;lstat(argv[1],&st);if(S_ISREG(st.st_mode))printf("-");else if (S_ISDIR(st.st_mode))printf("d");else if(S_ISLNK(st.st_mode))printf("l");int i=8;for ( ; i >= 0; i-=3){if(st.st_mode&1<<i!=0)printf("r");elseprintf("-");if(st.st_mode&1<<(i-1)!=0)printf("w");elseprintf("-");if(st.st_mode&1<<(i-2)!=0)printf("x");elseprintf("-");}
//用户名struct passwd *pw=getpwuid(st.st_uid);
//链接数    
printf(" %ld",st.st_nlink);printf(" %s ",pw->pw_name);
struct group *gr =getgrgid(st.st_gid);
//用户组名    
printf( "%s",gr->gr_name);
//长度    
printf(" %ld",st.st_size);char arr[100]={0};
//获取时间strcpy(arr,ctime(&st.st_mtime));if(arr[strlen(arr)-1]=='\n')arr[strlen(arr)-1]='\0';printf(" %s ",arr);puts("");return 0;}

2、目录文件函数

    1opendir

       作用:

           打开一个目录文件

       头文件

           #include<sys/types.h>

           #include<dirent.h>

       函数原型:

           DIR *opendir(const char *name)

       参数:

           name:目录文件

       返回值:

           成功返回目录流指针,失败返回 NULL并设置错误号。

    2、readdir

    作用:

       读取目录当中一个文件的属性

    头文件:

       dirent.h

    函数文件

       struct dirent *readdir(DIR * dirp);

    参数:

       dirp:想要操作的目录流指针

    返回值:

       成功返回读取到的文件的相关信息的地址,被保存在一个struct dirent结构体中,失败或者读完了所有文件的返回NULL

相关结构体:

struct dirent {

               ino_t          d_ino;       /* Inode number */

               off_t          d_off;       /* Not an offset; see below */

               unsigned short d_reclen;    /* Length of this record */

               unsigned char  d_type;      /* Type of file; not supported

                                              by all filesystem types */

               char           d_name[256]; /* Null-terminated filename */

           };

       3、closedir

       作用:

              关闭目录流指针

       头文件:

              #include <sys/types.h>

                  #include <dirent.h>

       函数原型:

              int closedir(DIR *dirp);

       参数:

              dirp:目录流指针

       返回值:

       成功返回0,失败返回-1并设置错误号


http://www.ppmy.cn/news/1059834.html

相关文章

数据可视化公司:打造视觉化的数据分析

数据在现代社会中扮演着至关重要的角色。然而&#xff0c;原始和复杂的数据往往难以理解和应用。在这个信息爆炸的时代&#xff0c;数据可视化公司成为了解决这个问题的关键。 数据可视化公司是专业的数据分析和可视化团队&#xff0c;他们的目标是将海量数据转化为易于理解和直…

HTTP协议初识·上篇

目录 认识URL urlencode和urldecode 如何编码解码和验证过程 一个基本的网络服务器的流程 代码验证请求与响应 准备工作 HTTPServer.hpp Protocol.hpp makefile 1请求 HTTPServer.hpp 1.0函数handlerHttp-基本流程 再次处理 HttpServer.cc(新建文件) 测试1 -- 请…

EMR电子病历系统 SaaS电子病历编辑器源码 电子病历模板编辑器

EMR&#xff08;Electronic Medical Record&#xff09;指的是电子病历。它是一种基于电子文档的个人医疗记录&#xff0c;可以包括病人的病史、诊断、治疗方案、药物处方、检查报告和护理计划等信息。EMR采用计算机化的方式来存储、管理和共享这些信息&#xff0c;以便医生和医…

cnpm安装时总是报错

使用npm下载cnpm安装时总是报错 解决办法&#xff1a; 1、执行&#xff1a;npm config get proxy npm config get https-proxy 如果返回值不为null&#xff0c;继续执行&#xff1a; &#xff08;这一步很重要&#xff0c;一定要保证两个命令的返回值都为null,话说回来&#xf…

Effective C++条款16——成对使用new和delete时要采取相同形式(资源管理)

以下动作有什么错? std::string* stringArray new std::string[100]; // ... delete stringArray;每件事看起来都井然有序。使用了new&#xff0c;也搭配了对应的 delete。但还是有某样东西完全错误:你的程序行为不明确&#xff08;未有定义&#xff09;。最低限度&#xff…

Modbus通信协议详解

Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议&#xff0c;控制器相互之间、控制器经由网络&#xff08;例如以太网&#xff09;和其它设备之间可以通信。它已经成为一通用工业标准。有了它&#xff0c;不同厂商生产的控制设备可以连成工业网络&#xff0c;进行集…

深入理解线性回归模型的评估与优化方法

文章目录 &#x1f340;引言&#x1f340;模型评估方法&#x1f340;均方误差&#xff08;MSE&#xff09;&#x1f340;均方根误差&#xff08;RMSE&#xff09;&#x1f340;绝对平均误差&#xff08;MAE&#xff09;&#x1f340;模型优化策略&#x1f340;特征工程&#x1…

一种IDEA疑难杂症的解决办法

解决办法 重启IDEA 针对于IDEA各种羡慕解析&#xff0c;运行时问题&#xff0c;但是无法通过搜索引擎得到答案的问题请试试此方法。 删除根目录下[.idea]文件夹后重启 此文件夹为idea首次导入项目时根据项目情况自动生成的配置文件。方便idea下次更快的解析项目。但是某些情…