C语言文件操作-文件IO(系统调用)

  • 文件IO (系统调用)
    • 文件描述符
    • open函数
    • read函数
    • write函数
    • lseek函数
    • close函数
    • dup函数
    • dup2函数
  • stat函数
  • getpwuid函数
  • getgrgid函数
    • 实例
  • 目录操作
    • opendir函数
    • readdir函数
    • rewinddir函数
    • closedir函数
    • 实例

文件IO (系统调用)

文件IO就是系统调用,用户空间进入内核空间的过程就是系统调用。
系统调用没有缓冲机制,效率较低,可移植性也相对较差,实时性高。

文件描述符

文件描述符是使用open函数打开文件时的返回值

对文件的读写操作,就是通过文件描述符来完成的。

文件描述符是一个整数,在一个程序中文件描述符的范围0-1023共计1024个,

使用 uilmit -a 可以查看一个程序中可以打开的文件的个数限制

(open files 后面对应的就是 这个值也可以使用命令 ulimit -n 2048来修改 但一般都是用默认值)

在一个程序启动的过程中,默认就会打开三个描述符(0 1 2),

分别对应标准输入、标准输出、标准错误。

其他文件描述符需要通过open函数来打开文件,并获得文件描述符。

文件描述符依次递增,文件描述符遵循复用原则,文件描述符关闭后,这个符号就空闲了,可以被其他程序使用.

open函数

open函数用来打开文件,并返回文件描述符。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int open(const char *pathname, int flags, mode_t mode);

参数:

  • pathname:要打开的文件的路径名
  • flags:打开文件的方式,可以是以下值:
    • O_RDONLY:只读方式打开

    • O_WRONLY:只写方式打开

    • O_RDWR:读写方式打开

    • O_CREAT:如果文件不存在,则创建文件

      • 如果指定了这个宏,则第三个参数 mode 必须填
      • 创建文件的权限还得涉及 掩码 umask
      • umask的值 默认为 0002 这个值也可以改的
      • 最终的权限 = (mode & ~umask)
      • 所以 即使给的是 0666 最终的权限也是 0664
    • O_APPEND:在文件尾部追加内容

    • O_TRUNC:如果文件存在,清空

    • O_EXCL:如果文件存在,则返回错误,错误码:EEXIST

  • mode:文件权限,一般八进制表示;

返回值:

  • 成功:返回文件描述符
  • 失败:返回-1,并设置errno

read函数

read函数用来从文件中读取内容。

#include <unistd.h>ssize_t read(int fd, void *buf, size_t count);

参数:

  • fd:文件描述符
  • buf:读取到的数据存放的缓冲区
  • count:要读取的字节数

返回值:

  • 成功:返回实际读取的字节数
  • 失败:返回-1,并设置errno

write函数

write函数用来向文件中写入内容。

函数原型:

#include <unistd.h>ssize_t write(int fd, const void *buf, size_t count); 

参数:

  • fd:文件描述符
  • buf:要写入的数据存放的缓冲区
  • count:要写入的字节数

返回值:

  • 成功:返回实际写入的字节数
  • 失败:返回-1,并设置errno

lseek函数

lseek函数用来移动文件读写指针的位置。

#include <unistd.h>off_t lseek(int fd, off_t offset, int whence);

参数:

  • fd:文件描述符
  • offset:相对于 whence 的偏移量
  • whence:
    • SEEK_SET:相对于文件开始位置
    • SEEK_CUR:相对于当前位置
    • SEEK_END:相对于文件结束位置

返回值:

  • 成功:返回新的文件位置
  • 失败:返回-1,并设置errno

close函数

close函数用来关闭文件。

#include <unistd.h>int close(int fd);

参数:

  • fd:文件描述符

返回值:

  • 成功:返回0
  • 失败:返回-1,并设置errno

dup函数

dup函数用来复制文件描述符。

#include <unistd.h>int dup(int oldfd);

参数:

  • oldfd:被复制的文件描述符

返回值:

  • 成功:返回新的文件描述符
  • 失败:返回-1,并设置errno

dup2函数

dup2函数用来复制文件描述符并修改文件描述符。

#include <unistd.h>int dup2(int oldfd, int newfd);

参数:

  • oldfd:被复制的文件描述符
  • newfd:新的文件描述符

返回值:

  • 成功:返回新的文件描述符
  • 失败:返回-1,并设置errno
  • 注意:如果newfd已经打开,则先关闭它。

stat函数

stat函数用来获取文件属性信息。

函数原型:

#include <sys/stat.h>int stat(const char *pathname, struct stat *buf);

参数:

  • pathname:文件路径名
  • buf:存放文件属性信息的结构体

返回值:

  • 成功:返回0
  • 失败:返回-1,并设置errno

结构体stat的定义如下:

struct stat {dev_t     st_dev;     //磁盘设备号ino_t     st_ino;     //inode节点号mode_t    st_mode;    //文件类型和权限st_mode & S_IFMT(0777) -> 文件权限获取文件的类型的方式: st_mode & S_IFMT 文件的类型S_IFMT     0170000   获取类型的掩码S_IFSOCK   0140000   套接字文件S_IFLNK    0120000   软链接文件S_IFREG    0100000   普通文件S_IFBLK    0060000   块设备文件S_IFDIR    0040000   目录文件S_IFCHR    0020000   字符设备文件S_IFIFO    0010000   管道文件例如:判断文件是否是普通文件if((stat.st_mode & S_IFMT) == S_IFREG)或者:if(S_ISREG(stat.st_mode))nlink_t   st_nlink;   //链接数uid_t     st_uid;     //所有者用户IDgid_t     st_gid;     //所有者组IDdev_t     st_rdev;    //设备号(若此对象为设备文件)off_t     st_size;    //文件大小(字节数)blksize_t st_blksize; //块大小(字节数)blkcnt_t  st_blocks;  //块数time_t    st_atime;   //最后访问时间time_t    st_mtime;   //最后修改时间time_t    st_ctime;   //最后状态改变时间#define st_atime st_atim.tv_sec//最后访问时间#define st_mtime st_mtim.tv_sec//最后修改时间#define st_ctime st_ctim.tv_sec//最后状态改变时间
};

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

可以获取链接的属性

getpwuid函数

getpwuid函数用来获取用户信息。

函数原型:

#include <pwd.h>struct passwd *getpwuid(uid_t uid);

参数:

  • uid:用户ID

返回值:

  • 成功:返回指向passwd结构体的指针
  • 失败:返回NULL,并设置errno

passwd结构体的定义如下:

struct passwd {char    *pw_name;    //用户名char    *pw_passwd;  //密码uid_t    pw_uid;     //用户IDgid_t    pw_gid;     //组IDchar    *pw_gecos;   //用户信息char    *pw_dir;     //用户主目录char    *pw_shell;   //用户登录shell
};

getgrgid函数

getgrgid函数用来获取组信息。

函数原型:

#include <grp.h>struct group *getgrgid(gid_t gid);

参数:

  • gid:组ID

返回值:

  • 成功:返回指向group结构体的指针
  • 失败:返回NULL,并设置errno

group结构体的定义如下:

struct group {char   *gr_name;    //组名char   *gr_passwd;  //组密码gid_t   gr_gid;     //组IDchar  **gr_mem;     //组成员列表
};

实例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pwd.h>
#include <grp.h>int main()
{int fd;char buf[1024];struct passwd *pw;struct group *gr;struct stat st;//打开文件fd = open("test.txt", O_RDONLY, 0666);if (fd == -1) {perror("open");exit(1);}//读取文件内容read(fd, buf, 1024);printf("%s\n", buf);//关闭文件close(fd);//获取文件属性if (stat("test.txt", &st) == -1) {perror("stat");exit(1);}//获取文件所有者信息pw = getpwuid(st.st_uid);if (pw == NULL) {perror("getpwuid");exit(1);}printf("owner: %s\n", pw->pw_name);//获取文件所属组信息gr = getgrgid(st.st_gid);if (gr == NULL) {perror("getgrgid");exit(1);}printf("group: %s\n", gr->gr_name);return 0;
} 

目录操作

opendir函数

opendir函数用来打开目录。

函数原型:

#include <dirent.h>DIR *opendir(const char *name);

参数:

  • name:目录路径名

返回值:

  • 成功:返回指向DIR结构体的指针
  • 失败:返回NULL,并设置errno

DIR结构体:

struct dirent {ino_t     d_ino;     //inode节点号off_t     d_off;     //目录偏移量unsigned short d_reclen; //目录项长度unsigned char  d_type;  //目录项类型char        d_name[NAME_MAX+1]; //目录项名
};

readdir函数

readdir函数用来读取目录中的文件信息。

函数原型:

#include <dirent.h>struct dirent *readdir(DIR *dirp);

参数:

  • dirp:指向DIR结构体的指针

返回值:

  • 成功:返回指向dirent结构体的指针
  • 失败:返回NULL,并设置errno

dirent结构体的定义如下:

struct dirent {ino_t     d_ino;     //inode节点号off_t     d_off;     //目录偏移量unsigned short d_reclen; //目录项长度unsigned char  d_type;  //目录项类型char        d_name[NAME_MAX+1]; //目录项名
};

rewinddir函数

rewinddir函数用来将目录读写指针指向文件头。

函数原型:

#include <dirent.h>void rewinddir(DIR *dirp);

参数:

  • dirp:指向DIR结构体的指针

返回值:

closedir函数

closedir函数用来关闭目录。

函数原型:

#include <dirent.h>int closedir(DIR *dirp);

参数:

  • dirp:指向DIR结构体的指针

返回值:

  • 成功:返回0
  • 失败:返回-1,并设置errno

实例

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pwd.h>
#include <grp.h>int main()
{DIR *dir;struct dirent *dp;struct stat st;//打开目录dir = opendir(".");if (dir == NULL) {perror("opendir");exit(1);}//读取目录中的文件信息while ((dp = readdir(dir)) != NULL) {printf("%s\n", dp->d_name);//获取文件属性if (lstat(dp->d_name, &st) == -1) {perror("lstat");exit(1);}//判断文件类型if (S_ISDIR(st.st_mode)) {printf("d");} else if (S_ISREG(st.st_mode)) {printf("-");} else if (S_ISLNK(st.st_mode)) {printf("l");} else if (S_ISFIFO(st.st_mode)) {printf("p");} else if (S_ISSOCK(st.st_mode)) {printf("s");} else {printf("?");}//获取文件所有者信息printf(" %d/%d ", st.st_uid, st.st_gid);//获取文件大小printf("%ld ", st.st_size);//获取文件修改时间printf("%s ", ctime(&st.st_mtime));}//关闭目录closedir(dir);return 0;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/43869.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/43869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年信息系统项目管理师1批次上午客观题参考答案及解析(3)

51、探索各种选项&#xff0c;权衡包括时间与成本、质量与成本、风险与进度、进度与质量等多种因素&#xff0c;在整个过程中&#xff0c;舍弃无效或次优的替代方案&#xff0c;这种不确定性应对方法是()。 A&#xff0e;集合设计 B&#xff0e;坚韧性 C&#xff0e;多种结果…

离线运行Llama3:本地部署终极指南_liama2 本地部署

4月18日&#xff0c;Meta在官方博客官宣了Llama3&#xff0c;标志着人工智能领域迈向了一个重要的飞跃。经过笔者的个人体验&#xff0c;Llama3 8B效果已经超越GPT-3.5&#xff0c;最为重要的是&#xff0c;Llama3是开源的&#xff0c;我们可以自己部署&#xff01; 本文和大家…

衡量股票价值的尺度

劳伦女士说&#xff0c;“邓普顿猎取便宜股的时候&#xff0c;总是运用证券分析师的‘一百种价值衡量尺度’中的好几种。 原因之一呢&#xff0c;就是因为任何一种衡量方法都是万能的&#xff0c;在不同的时期、不同的市场环境下&#xff0c;总会有它自己的局限性。就像有朋友…

大数据------JavaWeb------FilterListenerAJAXAxiosJSON

Filter Filter简介 定义&#xff1a;Filter表示过滤器&#xff0c;是JavaWeb三大组件&#xff08;Servlet、Filter、Listener&#xff09;之一。 作用&#xff1a;它可把对资源&#xff08;Servlet、JSP、Html&#xff09;的请求拦截下来从而实现一些特殊功能 过滤器一般完成…

【QT中实现摄像头播放、以及视频录制】

学习分享 1、效果图2、camerathread.h3、camerathread.cpp4、mainwindow.h5、mainwindow.cpp6、main.cpp 1、效果图 2、camerathread.h #ifndef CAMERATHREAD_H #define CAMERATHREAD_H#include <QObject> #include <QThread> #include <QDebug> #include &…

SAP顾问的核心竞争力是什么?

最近看到几个业内大佬在讨论这个话题&#xff0c;我也想谈谈我的看法。这位大佬的原话是“SAP顾问的核心技能不是配置软件&#xff0c;而是对财务、供应链、销售等运行流程的理解&#xff0c;解决的是企业流程和数据标准化的问题。” 我先不做评价&#xff0c;我先问几个问题。…

选择排序(C语言版)

选择排序是一种简单直观的排序算法 算法实现 首先在未排序序列中找到最小&#xff08;大&#xff09;元素&#xff0c;存放到排序序列的起始位置。 再从剩余未排序元素中继续寻找最小&#xff08;大&#xff09;元素&#xff0c;然后放到已排序序列的末尾。 重复第二步&…

【k8s安装redis】k8s安装单机版redis实现高性能高可用

文章目录 简介一.条件及环境说明&#xff1a;二.需求说明&#xff1a;三.实现原理及说明四.详细步骤4.1.创建configmap 配置文件4.2.创建StatefulSet 配置4.3.创建service headless 配置 五.安装说明 简介 本文将根据在k8s环境中搭建【伪】单机模式的redis实例。由于共享存储的…

020-GeoGebra中级篇-几何对象之点与向量

本文概述了在GeoGebra中如何使用笛卡尔或极坐标系输入点和向量。用户可以通过指令栏输入数字和角度&#xff0c;使用工具或指令创建点和向量。在笛卡尔坐标系中&#xff0c;示例如“P(1,0)”&#xff1b;在极坐标系中&#xff0c;示例如“P(1;0)”或“v(5;90)”。文章还介绍了点…

深入理解循环神经网络(RNN)

深入理解循环神经网络&#xff08;RNN&#xff09; 循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一类专门处理序列数据的神经网络&#xff0c;广泛应用于自然语言处理、时间序列预测、语音识别等领域。本文将详细解释RNN的基本结构、工作原理以及其优…

uniapp本地打包到Android Studio生成APK文件

&#xff08;1&#xff09;安装 Android Studio 软件&#xff1b; 下载地址&#xff1a;官方下载地址&#xff0c;英文环境 安装&#xff1a;如下之外&#xff0c;其他一键 next &#xff08;2&#xff09;配置java环境&#xff1b; 下载&#xff1a;j…

基于SpringBoot构造超简易QQ邮件服务发送 第二版

目录 追加 邮箱附件 添加依赖 编码 测试 第二版的更新点是追加了 邮箱附件功能 ( 后期追加定时任务 ) 基于SpringBoot构造超简易QQ邮件服务发送(分离-图解-新手) 第一版 追加 邮箱附件 添加依赖 <!-- 电子邮件 --><dependency><groupId>org.spri…

Java小白入门到实战应用教程-介绍篇

writer:eleven 介绍 编程语言介绍 编程语言按照抽象层次和硬件交互的方式划分为低级编程语言和高级编程语言。 低级编程语言更接近计算机硬件层面&#xff0c;通常具有执行效率高的特点&#xff0c;但是由于注重计算机底层交互&#xff0c;所以编程难度相对较大。 高级编程…

国内开源RAG知识库ChatWiki MaxKb QAnyThing对比

RAG 知识库 &#xff0c; 是一个比较火的赛道&#xff0c;以下是国内开源的RAG 知识库 ChatWiki 芝麻小客服开源的一个RAG 知识库&#xff0c;核心特点是和人工聊天系统打通&#xff0c;可以作为对外的聊天系统使用。 开源地址 https://github.com/zhimaAi/chatwiki 云端体…

如何评价Flutter?

哈喽&#xff0c;我是老刘 我们团队使用Flutter已经快6年了。 有很多人问过我们对Flutter的评价。 今天在这里回顾一下6年前选择Flutter时的原因&#xff0c;以及Flutter在这几年中的实际表现如何。 选择Flutter时的判断 1、性能 最开始吸引我们的就是其优秀的性能。 特别是…

【vue3|第16期】初探Vue-Router与现代网页路由

日期:2024年7月6日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^ 1.01365 = 37.7834;0.99365 = 0.0255 1.02365 = 1377.4083…

力扣第226题“翻转二叉树”

在本篇文章中&#xff0c;我们将详细解读力扣第226题“翻转二叉树”。通过学习本篇文章&#xff0c;读者将掌握如何使用递归和迭代的方法来翻转二叉树&#xff0c;并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释&#xff0c;以便于理解。 问题描述 力扣第…

深入探索联邦学习框架 Flower

联邦学习框架 本文主要期望介绍一个设计良好的联邦学习框架 Flower&#xff0c;在开始介绍 Flower 框架的细节前&#xff0c;先了解下联邦学习框架的基础知识。 作为一个联邦学习框架&#xff0c;必然会包含对横向联邦学习的支持。横向联邦是指拥有类似数据的多方可以在不泄露…

【CVPR 2024】GART: Gaussian Articulated Template Models

【CVPR 2024】GART: Gaussian Articulated Template Models 一、前言Abstract1. Introduction2. Related Work3. Method3.1. Template Prior3.2. Shape Appearance Representation with GMM3.3. Motion Representation with Forward Skinning3.4. Reconstruct GART from Monocu…

Java--instanceof和类型转换

1.如图&#xff0c;Object&#xff0c;Person&#xff0c;Teacher&#xff0c;Student四类的关系已经写出来了&#xff0c;由于实例化的是Student类&#xff0c;因此&#xff0c;与Student类存在关系的类在使用instanceof时都会输出True&#xff0c;而无关的都会输出False&…