Linux Day1 系统编程和文件操作

news2025/7/5 11:32:22

系统编程内容

文件I/O (输入/输出):

1)使用标准库函数如fopen, fclose, fread, fwrite, fgetc, fputc, fgets, fprintf, fscanf等进行文件操作。

2)使用open, close, read, write等系统调用来实现底层文件操作。

进程管理:

1)使用fork, exec系列函数来创建和执行新的进程。

2)使用wait, waitpid等函数来等待进程结束。

线程管理:

1)使用POSIX线程库(pthreads)中的函数如pthread_create, pthread_join, pthread_mutex_*等来管理线程。

内存管理:

1)使用malloc, calloc, realloc, free等函数进行动态内存分配。

2)使用mmap, munmap等系统调用进行内存映射。

信号处理:

1)使用signal, sigaction等函数来处理异步事件,如键盘中断(SIGINT)。

网络编程:

1)用套接字(sockets)API,包括socket, bind, listen, accept, connect, send, recv等函数进行网络通信。

系统调用:

1)直接使用系统调用,如stat, chmod, chown等,来执行文件属性修改等操作。

时间管理:

1)使用time, difftime, localtime, gmtime, strftime等函数来处理时间和日期。

系统信息获取:

1)使用uname, sysinfo等函数来获取系统相关信息。

错误处理:

1)理解并处理系统调用和库函数返回的错误,通常通过检查返回值和使用errno全局变量。

安全性:

1)了解并实现基本的安全编程实践,如使用setuid, setgid等函数时的注意事项。

设备I/O:

1)直接与硬件设备进行交互,使用设备文件进行读写操作。

脚本编程:

1)虽然不是C语言的一部分,但编写shell脚本与C程序结合使用也是Linux系统编程的一部分。

编译和链接:

1)使用编译器(如gcc)和链接器(如ld)来编译和链接程序。

调试和性能分析:

1)使用调试工具(如gdb)和性能分析工具(如valgrind)来调试和优化程序。

标准IO

标准I/O(Standard Input/Output)是C语言中用于输入和输出操作的一套函数库,由ANSI C标准定义。它是由Dennis Ritchie和其他C语言的先驱者设计的,目的是提供一个统一的接口来处理数据流。以下是一些关于标准I/O的关键点:

  1. 流(Stream)的概念:

    标准I/O使用流的概念来处理输入和输出。流可以是文件、键盘、屏幕等。

  2. 缓冲机制:

    标准I/O库通常使用缓冲区来提高I/O操作的效率。
    这意味着数据首先被写入内存中的缓冲区,
    然后在缓冲区满了或者调用了特定的函数(如fflush)时才被发送到目标设备。

  3. 格式化输入输出:

    标准I/O提供了格式化输入输出的功能,允许程序员指定数据的格式,如宽度、精度等。

  4. 主要函数:

    fopen: 打开一个文件,并返回一个指向FILE对象的指针。
    fclose: 关闭一个已经打开的文件流。
    fread: 从文件中读取数据到缓冲区。
    fwrite: 将数据从缓冲区写入文件。
    fgetc/getc: 从流中读取一个字符。
    fputc/putc: 向流中写入一个字符。
    fgets: 从流中读取一行数据。
    fputs: 向流中写入一个字符串。
    printf: 格式化输出到标准输出(通常是屏幕)。
    scanf: 从标准输入(通常是键盘)读取格式化数据。
    fprintf: 格式化输出到指定的文件流。
    fscanf: 从指定的文件流读取格式化数据。

  5. 错误处理:

    标准I/O提供了错误检测机制,如ferror函数可以检查流是否有错误发生。
  6. 标准流:

    有三个预定义的流:
    stdin: 标准输入(通常是键盘)。
    stdout: 标准输出(通常是屏幕)。
    stderr: 标准错误输出,用于输出错误信息(也通常是屏幕)。

  7. 文件打开模式:

    标准I/O支持多种文件打开模式,例如:
    "r":只读模式打开文件。
    "w":只写模式打开文件,如果文件存在则覆盖。
    "a":追加模式打开文件,如果文件存在则在文件末尾追加内容。
    "r+":读写模式打开文件。

  8. 定位和重定向:

    标准I/O允许使用fseek, ftell, rewind等函数对文件流进行定位。
  9. 临时文件:

    可以使用tmpfile函数创建临时文件。
  10. 内存流:

    可以使用fmemopen等函数在内存中创建流。

  11. 宽字符支持:

    标准I/O还提供了对宽字符的支持,如wprintf和wscanf等函数。

标准I/O库是C语言中非常重要的一部分,它为程序员提供了一种简便的方式来处理各种输入和输出任务。

IO的分类

标准IO(Standard IO):ANSI C设计的一组用文件IO封装的操作库函数,通过头文件stdio.h进行操作。
文件IO(File IO):底层软件的系统调用,用于对文件进行读写操作。
ASCII码数据流:以ASCII码作为数据流的文本流。
二进制数据流:以二进制数据作为数据流的二进制流。
 

  

操作文件基本思路


文件操作三步骤:
1.打开    -- fopen  //FILE open
2.读写    -- getchar/putchar 
                 gets / puts 
                fread / fwrite 
3.关闭    -- fclose 
 

一、文件编程

1.fopen   
FILE *fopen(const char *pathname, const char *mode);

参数:

1).const char *pathname:文件名/路径,这是char型指针,须在”文件名/路径“上加上双引号;

2).const char *mode:文件的操作权限,这里也是字符型指针,须在“操作权限”上加双引号;

2.fclose

fclose()函数用来关闭当前文件流,其原型为:
     

  int fclose(FILE * stream);
参数】stream为文件流指针。

【返回值】若关文件动作成功则返回0,有错误发生时则返回EOF,并把错误代码存到errno。

fclose()用来关闭fopen()打开的文件,此动作会让缓冲区内的数据写入文件中,并释放系统所提供的文件资源。

注意:使用fopen()打开的文件,一定要记得使用fclose()关闭,否则会出现很多意想不到的情况,例如对文件的更改没有被记录到磁盘上,其他进程无法存取该文件等。

举例:打开和关闭文件

#include <stdio.h> 
int main(void) 
{ 
   FILE *pf;   
   pf = fopen("file.in", "w+");     /*打开文件*/
   if(pf != NULL)
   {
    printf("open file ok\n");
   }
   else
   {
    printf("open file error\n");
   }
   fclose(pf); 
  
   return 0; 
}

流指针:

3.FILE * fp 
  
  FILE * fp;//流指针------关联一个文件   
      FILE * 实际上是指向了一块内存空间(缓存,fileno)

   

#include<stdio.h>
typedef struct{
	// 缓冲区“满”或“空”的程度
	short level;
	// 文件状态标志
	unsigned flags;
	// 文件描述符
	char fd;
	// 如无缓冲区则不读取字符
	unsigned char hold;
	// 缓冲区的大小
	short bsize;
	// 数据缓冲区的读写位置
	unsigned char *baffer;
	// 指针指向当前文件的读写位置
	unsigned char *curp;
	// 临时文件,指示器
	unsigned istemp;
	// 用于有效性检查
	short token;
}FILE;
FILE*fp;

FILE其实是一个 结构体,用于表示一个打开的文件流。p 是一个指针,指向这个结构体的实例。FILE * 类型使得你可以通过 p 访问和操作与文件相关的各种数据和函数

4.fputc
int fputc(int c, FILE *stream);


功能:
    向流中写入一个字符
参数:
    c:要写入的字符
    stream:文件流指针
返回值:
    成功返回写入的字符ASCII码值
    失败返回EOF

5.fgetc
int fgetc(FILE *stream);



功能:
    从流中读取一个字符
参数:
    stream:文件流指针
返回值:
    成功返回读到字符的ASCII码值
    读到文件末尾返回EOF(返回值与fputc一致)
    失败返回EOF 
    c= fgetc(stdin);
    fputc(c,stdout);
    获取键盘上面的输入,显示到屏幕。
 

6.fgets:
char *fgets(char *s, int size, FILE *stream);


功能:
      从stream流对象关联的文件中获取size大小字节的文本数据
      并存储到s对应的本地内存(栈区数组,堆区内存)
      
参数: s 要存储数据的本地内存
       size 要获取的数据长度,单位字节。
       stream 要获取的目标文件流对象,
        可以是stdin ,程序会阻塞等待
        如果是普通文件fp 则指向文件第一行数据
返回值:成功 返回指向有效数据的首地址,一般等于s的地址
        失败 或者 文件末尾 NULL;

fgets读取结束的条件:
1.EOF 文件结束 
2.\n  读到 "换行符" 则读取结束 
  注意:
    会被保存到 buffer(保存数据的这块内存中)
3.size-1 个字符 
  最后一个字符为'\0'    //按字符串读写,
7.fputs:
int fputs(const char *s, FILE *stream);


功能:
       从s所在的本地内存中获取一行数据,
       并写入stream对应的文件流对象。
参数: s 要写的信息,一般是固定的字符串或者有数据的数组。
       stream 要写入的目标文件流对象

返回值:成功 nonnegative number on success(成功写入的字符个数(非负数))
        失败 -1;

8.fread:
size_t  fread(void  *ptr,  size_t size, size_t nmemb, FILE *stream);


功能:从指定的stream流对象中获取nmemeb个大小为size字节的数据块到ptr
      所在的本地内存中。
参数:ptr 要存储数据的本地内存一般是数组或者结构体指针
      size 单个数据块的元数据大小。最小单元的大小(为保证数据不会被截断,一般为1)
      nmemb 要获取的数据块的个数,拷贝的数据块个数。(一般为sizeof(ptr))
      stream 要获取数据的源文件流对象,如果是stdin表示从
      键盘获取数据,如果是fp文件则表示从普通文件获取。
返回值:
        成功 小于等于nemeb的整数,表示获取的数据长度
        失败 小于0,结尾 0;

9.fwrite:
size_t fwrite(const void  *ptr,  size_t  size,size_t nmemb, FILE *stream);


功能:从ptr所在本地内存中取出nmemb个大小为size的数据块写入到stream流对应
     的文件流对象中。
参数:ptr 要写的数据块地址,一般是数组或者结构体指针
          size  要写的数据块元数据大小,单位是字节(为保证数据不会被截断,一般为1)
         nmemb 要写的数据块的个数(一般为sizeof(ptr))->1个1个读,到sizeof(ptr)为止
        stream 要写的目标文件流对象。如果是stdout则表示数据会
        写到终端屏幕显示,如果是fp的普通文件则会写入到文件中。

返回值:成功 小于等于nmemb 的个数。
        失败 <0
 

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

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

相关文章

力扣 3152. 特殊数字Ⅱ

题目描述 queries二维数组是nums数组待判断的索引区间&#xff08;左闭右闭&#xff09;。需要判断每个索引区间中的nums相邻元素奇偶性是否不同&#xff0c;如果都不同则该索引区间的搜索结果为True&#xff0c;否则为False。 暴力推演&#xff1a;也是我最开始的思路 遍历q…

招聘技术研发类岗位,HR会考察候选人哪些方面?

技术研发团队在当下的企业视为发展的核心&#xff0c;对于企业长期发展和市场竞争力至关重要&#xff0c;作为HR&#xff0c;如何选拔技术研发岗位的人才&#xff0c;也是难度较大的工作。 作为应聘者来说&#xff0c;同样应该主动去了解HR是如何考察技术性人才&#xff0c;以…

使用docker部署rabbitmq集群

部署环境准备 192.168.81.128 rabbitmq-1 192.168.81.129 rabbitmq-2 192.168.81.130 rabbitmq-3 首先创建挂载目录&#xff08;三个节点都创建&#xff09; systemctl stop firewalld && setenforce 0 关闭防火墙和selinux mkdir /data/rabbitmq -p cd /da…

加和分数、训练、测试

一、加和所有alignment的分数 1、路线图中 2、l_i只与token有关&#xff0c;有一个专门训练的网络&#xff1b;h_i变化只与null有关 3、distribution生成的概率不受路径影响&#xff0c;只要到达位置概率就是一样的 4、计算alignment分数的总和 &#xff08;1&#xff09;αi…

Word转html并移植到web项目

1.打开对应word文件 建议使用web视图查看文档 这样可以提前预览转转成html样式 2.如果有图片修改图片大小及格式 在web视图下&#xff0c;把图片调制适当大小&#xff0c;不然导出的html可能图片较小 3.点击另存为 4.选择网页格式&#xff0c;同时将后缀修改为html(默认是h…

从springBoot框架服务器上下载文件 自定义一个启动器

在springboot框架中下载服务器存储的图片&#xff1a; 1&#xff09;springboot默认访问放行的目录只有static&#xff0c;在static目录下存放图片资源 2&#xff09;编译后的static目录中有一个1.png 2.5)编写控制器&#xff1a; Controller //RequestMapping("/upload&q…

如何在 Linux 内核中高效使用链表:原理与实践

文章目录 前言一、Linux内核链表源码分析1.链表的初始化1. 静态初始化宏 LIST_HEAD_INIT(name)宏 LIST_HEAD(name) 2. 动态初始化函数 INIT_LIST_HEAD(struct list_head *list) 对比总结2.链表的添加list_add 函数的定义函数参数内部实现__list_add 函数 list_add 的功能总结使…

Java Spring|day4.SpringCloud

SpringCloud 定义 springcloud是分布式微服务架构的一站式解决方案&#xff0c;是多种微服务架构落地技术的集合体&#xff0c;俗称微服务全家桶。实现的功能有服务注册与发现&#xff0c;服务调用&#xff0c;服务熔断&#xff0c;负载均衡&#xff0c;服务降级&#xff0c;…

Excel公式合并同类项

Excel公式合并同类项 1、新建表&#xff0c;用公式引用要处理的数据&#xff0c;快速选中表格复制公式2、 合并同类项&#xff0c;复制数据&#xff0c;删除重复项3、 sumif()合并同类项4、vlookup()复制同类项 1、新建表&#xff0c;用公式引用要处理的数据&#xff0c;快速选…

docker数据卷:

docker数据卷&#xff1a; 容器和宿主机之间数据共享 容器和宿主机之间数据共享——————挂载卷————容器内的目录和宿主机的目录进行挂载&#xff0c;实现数据文件共享 容器的生命周期有限&#xff0c;一旦重启所有对容器内部文件数据的修改以及保存的数据都会被初始…

深入理解 iOS 中的 AutoLayout(二)

目录 前言 一、UIStackView自动布局 1.简单的UIStackView 2.嵌套的UIStackView 二、AutoLayout高级用法 1.以编程方式创建约束 1.布局锚点 1.主要特点 2.常见子类 1.NSLayoutXAxisAnchor 2.NSLayoutYAxisAnchor 3.NSLayoutDimension 3.常用方法 4.…

SQL server数据库备份和还原

新手小白都懂的sql server数据库备份和还原 一、备份 1.打开sql server数据库找到 2.展开找到对应的数据库文件 鼠标右击—任务–备份 3.复制名称 4.复制完点击添加 5.点击添加完之后再次点击查找路径 6.分别两个路径 原路径和新路径 &#xff08;新路径是找到原路径新建了一…

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. 问题解决

问题描述 原来我的服务器docker服务运行正常&#xff0c;但在某次尝试用时, 根据系统的错误提示执行了snap install docker指令之后&#xff0c; 再执行docker ps命令则提示Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running…

Arm Linux 串口 open 标志引起的问题

一、测试环境 硬件&#xff1a;nuc980 开发版 系统&#xff1a;Linux 4.4 二、open 函数描述 函数 open 的介绍 头文件 #include <fcntl.h>原型 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>int open(const char *pathname,…

LabVIEW开发HVAC总成真空检测及监控系统

在HVAC&#xff08;Heating, Ventilation, and Air Conditioning&#xff0c;供暖、通风与空气调节&#xff09;总成制造过程中&#xff0c;真空检测是确保产品质量的重要环节。真空度是判断HVAC总成密封性能和气密性的关键指标&#xff0c;因此需要一个自动化、精准且可追溯的…

上海泌尿专家来黄山新晨医院义诊,解决患者前列腺等疑难疾病

为满足广大男性对自身健康的关爱、让男性患者不出远门&#xff0c;就能享受到高质量的上海男科诊疗服务&#xff0c;7月28日黄山新晨医院特邀请上海第四人民医院泌尿外科周铁主任团队到院&#xff0c;开展男科疾病义诊活动。 周铁主任为中华医学会泌尿外科分会男科学组委员&…

【docker系列】docker删除指定容器

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

超详细!!!electron-vite-vue开发桌面应用之Electron Forge打包项目(三)

云风网 云风笔记 云风知识库 electronforge可将前端静态页面打包成.exe、.deb和.rpm等&#xff0c;能适配各种平台 一、安装依赖 cd my-app npm install --save-dev electron-forge/cli npm exec --packageelectron-forge/cli -c "electron-forge import"安装后pack…

Prostgresql的Timescaledb插件/扩展部署

背景&#xff1a;研发需求&#xff0c;需要把docker部署得postgresql迁移到新的节点并要求再本地部署&#xff0c;提前查看数据库需要那些插件&#xff0c;并进行安装&#xff0c;docker部署的默认有插件。 版本对比&#xff1a;postgresql版本对应某个Timescaledb版本 我得p…

登录过程记录

过程&#xff1a; 未登录状态打开我的消息页-》调用后端接口查询登录状态->后端接口从cookie里拿lt,判断是否登录-》未登录&#xff0c;携带页面链接(我的消息)跳转passport【单点登录服务】 登录页-》输入验证码提交后-》验证成功-》根据用户信息生成票据-》携带票据和我的…