Linux---系统函数

一、打开文件open

#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_TRUNC   //文件存在  截短为0 
  @mode     一般不用
            当flags中使用了 O_CREAT 时,需要指定 mode   
            mode 0777
                 0666
                 0444                  
返回值:
  成功 文件描述符
  失败 -1 && errno会被设置 
 

#include<stdio.h>
#include<fcntl.h>int main(int argc, const char *argv[])
{if(argc != 2){printf("Usage: %s <filename>\n",argv[0]);return -1;}int fd = open(argv[1],O_WRONLY|O_CREAT,0666);if(fd < 0){perror("open fail");return -1;}#if 0printf("open succes fd = %d\n",fd);printf("stdin fileno = %d\n",stdin->_fileno);printf("stdout fileno = %d\n",stdout->_fileno);printf("stderr fileno = %d\n",stderr->_fileno);
#endifreturn 0;
}

  
对比fopen             open


r                O_RDONLY 
r+               O_RDWR

w                O_WRONLY|O_CREAT|O_TRUNC 
w+               O_RDWR|O_CREAT|O_TRUNC

a                O_WRONLY|O_APPEND|O_CREAT
a+               O_RDWR |O_APPEND|O_CREAT
 

文件创建好后的权限:


  a.指定的mode 
  b.umask  (掩码) //二进制位 --- 遮住 

  最终文件的权限 = ~umask & mode

二、关闭文件 close

int close(int fd);
功能:
   关闭文件描述符
   以便 再次使用 
参数:
  @fd  要关闭的文件描述符
返回值:
  成功 0
  失败 -1 
  
文件描述符:
1.非负整型数值 
2.分配原则
  最小未使用   
3.范围 
  0~1023 
 

三、读写文件 read   write

#include <unistd.h>


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


功能: 
    从fd中读数据 ,存到 buf中 
参数:
   @fd 要读取的文件 
   @buf 存放读取到的数据的 内存空间 
   @count 一次要读取的数量(字节)
返回值:
   成功 表示成功读到的字节数 
   失败 -1 && errno 
   
   读取结束:
      0 表示到达文件结尾


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


功能: 
    把buf中 写到fd中 
参数:
   @fd    要写入的文件 
   @buf   存放数据的 内存空间 
   @count 一次要写入的数量(字节)
返回值:
   成功 表示成功写入的字节数 
   失败 -1 && errno 
 

#include<stdio.h>
#include<unistd.h>int main(int argc, const char *argv[])
{char buf[1024] = {0};while(1){int ret = read(0,buf,100);//	buf[ret-1] = '\0';//	printf("ret = %d buf = %s\n",ret,buf);write(1,buf,ret);}return 0;
}

练习:
   cat  //文件IO 实现 

#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>int main(int argc, const char *argv[])
{if(argc != 2){printf("Usage: %s <filename>\n",argv[0]);return -1;}int fp = open(argv[1],O_RDONLY);if(fp < 0){perror("open fail");return -1;}char buf[1024] = {0};int ret = 0;while(ret = read(fp,buf,sizeof(buf)-1) ){write(1,buf,ret);}close(fp);return 0;
}

练习:
   实现cp 

#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>int main(int argc, const char *argv[])
{if(argc != 3){printf("Usage: %s <dest> <srt>\n",argv[0]);return -1;}int fp1 = open(argv[1],O_RDONLY);int fp2 = open(argv[2],O_WRONLY | O_CREAT|O_TRUNC ,0666);if(fp1 < 0 || fp2 < 0){perror("open fail");return -1;}char buf[1024] = {0};int ret = 0;while(ret = read(fp1,buf,sizeof(buf)-1) ){write(fp2,buf,ret);}close(fp1);close(fp2);return 0;
}

四、偏移lseek 

off_t lseek(int fd, off_t offset, int whence);
功能:
     重新定位文件偏移量 
参数:
    @fd      要定位的文件 
    @offset  偏移量 
    @whence  参考点 
               SEEK_SET //相对于文件开头的 
                  offset >=0 
               SEEK_CUR //相对于当前位置
                  offset>=0
                  offset<0   //不能超过这个文件开头
               SEEK_END //相对于文件末尾 
                  offset < 0  //不能超过这个文件开头
                  offset >= 0 //可以  --- 创建 空洞 文件
   
返回值:
   成功 从头的偏移量
   失败  -1 && errno

lseek(fd,0,SEEK_SET); //定位到文件开头 
lseek(fd,0,SEEK_END);

获得文件长度:
off_t len = lseek(fd,0,SEEK_END); //off_t <=> long int

注意:
    1、不支持O_APPEND的追加模式,无法生成空洞文件。
    2、lseek函数执行失败,文件指针还在偏移前的位置。
    3、lseek函数在设备文件上偏移无效。 /dev/video0 
    4、fifo,socket 也不支持lseek的操作。
   

#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>int main(int argc, const char *argv[])
{if(argc != 2){printf("Usage: %s <filename>\n",argv[0]);return -1;}int fd = open(argv[1],O_RDONLY);if(fd < 0){perror("open fail");return -1;}printf("open success fd = %d\n",fd);printf("len = %ld\n",lseek(fd,0,SEEK_END));return 0;
}

练习:
   创建空洞文件 
   给定一个文件,创建一个同样大小的空洞文件 

#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>int main(int argc, const char *argv[])
{if(argc != 2){printf("Usage: %s <filename>\n",argv[0]);return -1;}int fd1 = open(argv[1],O_RDONLY);if(fd1 < 0){perror("open fail");return -1;}int len = lseek(fd1,0,SEEK_END);int fd2 = open("hole.txt",O_WRONLY|O_CREAT,0666);if(fd2 < 0){perror("open fail");return -1;}lseek(fd2,len-1,SEEK_END);//留出写'\0'的空间write(fd2,"",1);//该字符串指向字符串常量区,空字符串里有‘\0’close(fd1);close(fd2);return 0;
}

五、库函数和系统调用对比

库函数: //标准IO
     优点:
         a.方便,功能多 
         b.可移植性好 
           标准 
     不足:
         c.可能存在 安全性 隐患


系统调用:
     优点:
         a.使用起来,简单 ,功能简单
         b.安全性高 
         c.设备文件 ---- 文件IO      ///dev/video0 ----> fopen();     
     缺点:
         c.很多复杂功能需要自己封装设计
         d.可移植性差 

六、系统调用中的函数

(一)fdopen()  //将fd 转换  成 FILE *       ——       fileno()  //将FILE *转换 为 fd

1、FILE *fdopen(int fd,const char *mode);


功能:
   将fd 转换  成 FILE * 
参数:
   @fd    要操作fd
   @mode  打开的模式
返回值: 
   成功 FILE *
   失败 NULL

2、int fileno(FILE *stream);


功能:
    将FILE *转换 为 fd
参数:
   @stream  要转换流指针 
返回值:
   成功 fd 
   失败 - && errno   

#include<stdio.h>
#include<fcntl.h>int main(int argc, const char *argv[])
{int fd = open("1.txt",O_RDONLY);if(fd < 0){perror("open fail");return -1;}printf("fd = %d\n",fd);FILE *fp = fdopen(fd,"r");if(fp == NULL){perror("fdopen fail");return -1;}printf("success\n");int fd1 = fileno(fp);printf("fileno = %d\n",fd1);return 0;
}


3、使用的选择:


  标准IO   --- 可移植性 如果操作只是文本数据 
  文件IO   --- 安全性  操作的是硬件 ---文件IO

操作目录

目录也是一种文件 
类似 标准IO 

(二)opendir

DIR *opendir(const char *name); 
功能:
    打开目录,关联一个目录流
参数:
  @name  要打开的目录名 
返回值:
  成功 返回DIR *
  失败 NULL & errno

#include<stdio.h>
#include<dirent.h>int main(int argc, const char *argv[])
{DIR *dir = opendir(argv[1]);if(dir == NULL){perror("opendir fail");return -1;}printf("success\n");return 0;
}

(三)读取目录readdir

struct dirent *readdir(DIR *dirp);
功能:
    读取目录项 
参数:
   @dirp 目录流指针 
返回值:
   成功 struct dirent *
   失败 NULL && errno
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 */
}

注意:
   读到文件末尾 NULL
 

#include<stdio.h>
#include<dirent.h>int main(int argc, const char *argv[])
{DIR *dir = opendir(argv[1]);if(dir == NULL){perror("opendir fail");return -1;}printf("success\n");struct dirent *pdir = readdir(dir);printf("ino = %ld\n",pdir->d_ino);printf("type = %d\n",pdir->d_type);printf("name = %s\n",pdir->d_name);closedir(dir);return 0;
}

(四)close

int closedir(DIR *dirp);
   功能:
      关闭目录流
   参数:
      @dirp --- 目录流指针 
   返回值:
      成功 0
      失败 -1 &&errno 
 

练习:
    实现ls

#include<stdio.h>
#include<dirent.h>int main(int argc, const char *argv[])
{if(argc != 2){printf("Usage: %s <dirname>\n",argv[0]);return -1;}DIR *dir = opendir(argv[1]);if(dir == NULL){perror("opendir fail");return -1;}struct dirent *pdir ;while((pdir = readdir(dir)) != NULL){if(pdir->d_name[0] != '.')printf("%s  ",pdir->d_name);}putchar('\n');closedir(dir);return 0;
}

练习:
   shell 
   给定一个目录,统计目录下的 普通文件 和 目录文件的个数

#include<stdio.h>
#include<dirent.h>int main(int argc, const char *argv[])
{if(argc != 2){printf("Usage: %s <dirname>\n",argv[0]);return -1;}DIR *dir = opendir(argv[1]);if(dir == NULL){perror("opendir fail");return -1;}struct dirent *pdir ;int n = 0;while((pdir = readdir(dir)) != NULL){if(pdir->d_type == DT_REG){n++;}}rewinddir(dir);int m = 0;while((pdir = readdir(dir)) != NULL){if(pdir->d_type == DT_DIR){m++;}}printf("directory = %d\n",m);printf("regular = %d\n",n);closedir(dir);return 0;
}

(五)chdir

chdir ("/home/linux"); "../../"
fopen("1.mp4")
int chdir(const char *path);// /home/linux
功能:
    改变当前程序的工作路径
参数:
    path:改变到的路径
返回值:
    成功 返回0
    失败 返回-1


(六)getcwd

char *getcwd(char *buf, size_t size);
功能:
    获得当前的工作路径
参数:
    buf:保存工作路径空间的首地址
    size:保存路径空间的长度
返回值:
    成功返回包含路径空间的字符串首地址
    失败返回NULL
 

#include<stdio.h>
#include<unistd.h>int main(int argc, const char *argv[])
{char buf[1024];getcwd(buf,sizeof(buf));printf("cwd = %s\n",buf);chdir("/home");getcwd(buf,sizeof(buf));printf("cwd = %s\n",buf);return 0;
}

(七)mkdir

nt mkdir(const char *pathname, mode_t mode);//777  666 --x--x--x
功能:
    创建一个目录
    666-
参数:
    pathname:路径
    mode:
        mode & ~umask  0002
        
返回值:
    成功 返回0
    失败 返回-1
 

(八)rmdir

int rmdir(const char *pathname);
功能:
    删除一个空目录文件
参数:
    pathname:目录文件的名字
返回值:
    成功 返回0
    失败 返回-1

#include<stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include<unistd.h>int main(int argc, const char *argv[])
{if(argc != 2){printf("Usage: %s <dirname>",argv[0]);return -1;}#if 0if(-1 == mkdir(argv[1],0777)){printf("mkdir fail\n");}else{printf("mkdir success\n");}
#endifif(-1 == rmdir(argv[1])){printf("rmdir fail\n");}else{printf("rmdir success\n");}return 0;
}

(九)sprintf

将格式化的输出结果,放到一个 字符数组空间上 形成一个字符串

#include<stdio.h>int main(int argc, const char *argv[])
{
#if 0int a = 10;float b = 2.1;char c = 'A';printf("a = %d b = %f c = %c\n",a,b,c);char buf[1024];sprintf(buf,"%d %f %c",a,b,c);printf("buf = %s\n",buf);
#endifchar buf[1024];sprintf(buf,"%s/%s",argv[1],argv[2]);printf("buf = %s\n",buf);return 0;
}

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

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

相关文章

智能编程助手功能革新与价值重塑之:GitHub Copilot

引言&#xff1a; GitHub Copilot 的最新更新为开发者带来了显著变化&#xff0c;其中 Agent Mode 功能尤为引人注目。该模式能够自动识别并修复代码错误、自动生成终端命令&#xff0c;并具备多级任务推理能力&#xff0c;这使得开发者在开发复杂功能时&#xff0c;可大幅减少…

Elasticsearch+Logstash+Kibana可视化集群部署

文章目录 1.组件介绍简述2.集群规划3.Es组件部署4.Logstash组件部署5.Kibana组件部署6.Kibana的基础使用 1.组件介绍简述 Elasticsearch&#xff1a;开源实时分布式搜索和分析引擎&#xff0c;支持大规模数据存储和高吞吐量&#xff0c;提供丰富的搜索功能和可扩展性。 Logsta…

SpringBoot多数据源实践:基于场景的构建、实现和事务一体化研究

1. 多数据源应用场景剖析 1.1 业务驱动的多数据源需求 数据量与业务复杂度引发的分库分表&#xff1a;在现代企业级应用中&#xff0c;随着业务的不断拓展和用户量的持续增长&#xff0c;数据量呈爆炸式增长。例如&#xff0c;在大型电商平台中&#xff0c;用户数据、订单数据…

LabVIEW 中dde.llbDDE 通信功能

在 LabVIEW 功能体系中&#xff0c;位于 C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform\dde.llb 的 dde.llb 库占据着重要的地位。作为一个与动态数据交换&#xff08;DDE&#xff09;紧密相关的库文件&#xff0c;它为 LabVIEW 用户提供了与其他…

数据结构-栈和队列的应用

目录 前言一、栈的应用&#xff08;迷宫问题&#xff09;1.1 问题描述1.2 算法选择1.3 算法精化1.4 算法实现1.5 问题结果 二、队列的应用&#xff08;农夫过河问题&#xff09;2.1 问题描述2.2 算法选择2.3 算法精化2.4 算法实现2.5 问题结果 总结 前言 本篇文章使用两个例子…

SkyWalking 10.1.0 实战:从零构建全链路监控,解锁微服务性能优化新境界

文章目录 前言一、集成SkyWalking二、SkyWalking使用三、SkyWalking性能剖析四、SkyWalking 告警推送4.1 配置告警规则4.2 配置告警通知地址4.3 下发告警信息4.4 测试告警4.5 慢SQL查询 总结 前言 在传统监控系统中&#xff0c;我们通过进程监控和日志分析来发现系统问题&…

AIGC图生视频保姆级教程

一、AI文生图高阶技巧 推荐工具 ▸ MidJourney&#xff08;艺术感最强&#xff09; ▸ DALLE 3&#xff08;与ChatGPT深度联动&#xff09; ▸ Leonardo.ai&#xff08;精细化参数控制&#xff09; 核心策略 提示词架构&#xff1a; [主体描述][环境氛围][镜头语言][风格参数…

springboot整合mybatis-plus【详细版】

目录 一&#xff0c;简介 1. 什么是mybatis-plus2.mybatis-plus特点 二&#xff0c;搭建基本环境 1. 导入基本依赖&#xff1a;2. 编写配置文件3. 创建实体类4. 编写controller层5. 编写service接口6. 编写service层7. 编写mapper层 三&#xff0c;基本知识介绍 1. 基本注解 T…

利用亚马逊云科技RDS for SQL Server配置向量数据存储

生成式人工智能&#xff08;AI&#xff09;正迎来又一个快速发展期&#xff0c;引起了开发者们的广泛关注。将生成式能力集成到商业服务和解决方案中变得非常重要。当前的生成式AI解决方案是机器学习和深度学习模型逐步进化迭代的结果。从深度学习到生成式AI的质变飞跃主要是由…

c++ 多线程知识汇总

一、std::thread std::thread 是 C11 引入的标准库中的线程类&#xff0c;用于创建和管理线程 1. 带参数的构造函数 template <class F, class... Args> std::thread::thread(F&& f, Args&&... args);F&& f&#xff1a;线程要执行的函数&…

H5接入支付宝手机网站支付并实现

小程序文档 - 支付宝文档中心 1.登录 支付宝开放平台 创建 网页/移动应用 2.填写创建应用信息 3.配置开发设置 4.网页/移动应用&#xff1a;需要手动上线。提交审核后&#xff0c;预计 1 个工作日的审核时间。详细步骤可点击查看 上线应用 。应用上线后&#xff0c;还需要完成…

字节二面:DNS是什么?是什么原理?

写在前面 最近有个同学后台私信让我出一个DNS的工作原理&#xff0c;面试的时候居然问到了&#xff0c;所以就简单聊聊DNS的工作原理吧&#xff01; 1. DNS 的核心作用 DNS&#xff08;域名系统&#xff0c;Domain Name System&#xff09;是互联网中用于将人类可读的域名转…

【Unity3D】Jenkins Pipeline流水线自动构建Apk

目录 一、准备阶段 二、创建Pipeline流水线项目 三、注意事项 四、扩展 1、Pipeline添加SVN更新项目Stage阶段 一、准备阶段 1、安装tomcat 10.0.5 Index of apache-local/tomcat/tomcat-10 2、安装jdk 17 Java Archive Downloads - Java SE 17.0.13 and later 3、…

【数据结构】(9) 优先级队列(堆)

一、优先级队列 优先级队列不同于队列&#xff0c;队列是先进先出&#xff0c;优先级队列是优先级最高的先出。一般有两种操作&#xff1a;返回最高优先级对象&#xff0c;添加一个新对象。 二、堆 2.1、什么是堆 堆也是一种数据结构&#xff0c;是一棵完全二叉树&#xff0c…

2025.2.15

web [HNCTF 2022 Week1]Interesting_include&#xff1a; 直接打开 PHP代码片段包含两部分&#xff1a;一个主脚本和一个潜在的被包含文件。主脚本负责处理GET请求&#xff0c;特别是filter参数&#xff0c;而被包含文件&#xff08;假设为./flag.php&#xff09;似乎包含了我…

CentOS 7.8 安装MongoDB 7教程

文章目录 CentOS 7.8 安装MongoDB 7教程一、准备工作1. 系统更新2. 权限 二、添加MongoDB软件源1. 创建MongoDB的yum源文件2. 添加以下内容3. 保存并退出编辑器 三、安装MongoDB1. 更新yum缓存2. 安装MongoDB 四、启动MongoDB服务1. 启动MongoDB2. 设置MongoDB开机自启动 五、配…

ElasticSearch基础和使用

ElasticSearch基础 1 初识ES相关组件 &#xff08;1&#xff09;Elasticsearch是一款非常强大的开源搜索引擎&#xff0c;可以帮助我们从海量数据中快速找到需要的内容。Elasticsearch结合kibana、Logstash、Beats组件 也就是elastic stack&#xff08;ELK&#xff09; 广泛应…

[C++]多态详解

目录 一、多态的概念 二、静态的多态 三、动态的多态 3.1多态的定义 3.2虚函数 四、虚函数的重写&#xff08;覆盖&#xff09; 4.1虚函数 4.2三同 4.3两种特殊情况 &#xff08;1&#xff09;协变 &#xff08;2&#xff09;析构函数的重写 五、C11中的final和over…

【git-hub项目:YOLOs-CPP】本地实现01:项目构建

目录 写在前面 项目介绍 最新发布说明 Segmentation示例 功能特点 依赖项 安装 克隆代码仓库 配置 构建项目 写在前面 前面刚刚实现的系列文章: 【Windows/C++/yolo开发部署01】 【Windows/C++/yolo开发部署02】 【Windows/C++/yolo开发部署03】 【Windows/C++/yolo…

在WPS中通过JavaScript宏(JSA)调用本地DeepSeek API优化文档教程

既然我们已经在本地部署了DeepSeek,肯定希望能够利用本地的模型对自己软件开发、办公文档进行优化使用,接下来就先在WPS中通过JavaScript宏(JSA)调用本地DeepSeek API优化文档的教程奉上。 前提: (1)已经部署好了DeepSeek,可以看我的文章:个人windows电脑上安装DeepSe…