Linux Day1 系统编程和文件操作

系统编程内容

文件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.rhkb.cn/news/401330.html

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

相关文章

安卓用户专属福利:OfficeSuite中文高级版,让你的工作更轻松!

OfficeSuite – 世界顶级移动办公软件&#xff01;Google Play商店下载最多的办公软件应用&#xff0c;迄今为止&#xff0c;智能手机平台上&#xff0c;功能最强大、兼容性最好的移动Office办公套件。创建&#xff0c;查看和编辑Word&#xff0c;Excel和PowerPoint文档&#x…

ThinkPHP5漏洞分析之代码执行

漏洞概要 本次漏洞存在于 ThinkPHP 的缓存类中。该类会将缓存数据通过序列化的方式&#xff0c;直接存储在 .php 文件中&#xff0c;攻击者通过精心构造的 payload &#xff0c;即可将 webshell 写入缓存文件。缓存文件的名字和目录均可预测出来&#xff0c;一旦缓存目录可访问…

python自动化笔记:os模块和异常处理

目录 一、os模块1.1、常用方法1.2、其他方法&#xff08;了解即可&#xff09; 二、异常处理 try except2.1、语法格式1&#xff1a;2.2、语法格式2&#xff1a;指定异常类别&#xff0c;捕获异常2.3、语法格式3&#xff1a;try-finally 语句无论是否发生异常都将执行最后的代码…

SQL每日一练-0814

今日SQL题难度&#xff1a;&#x1f31f;☆☆☆☆☆☆☆☆☆ 1、题目要求 找出每个部门中薪资最高的员工显示部门ID、部门名称、员工ID、员工姓名以及对应的薪资 2、表和虚拟数据 现有两个表&#xff1a;Employees 和 Departments&#xff0c;记录了员工和部门信息。…

【机器学习】ImageNet的基本概念以及如何使用ImageNet数据集

引言 ImageNet是一个大型的图像数据库&#xff0c;它根据WordNet的层级结构&#xff08;目前仅限于名词&#xff09;组织&#xff0c;其中每个层级节点都由成百上千张图像来描绘。这个项目对计算机视觉和深度学习研究的发展起到了重要作用 文章目录 引言一、ImageNet的基本概念…

一次sql请求,返回分页数据和总条数

日常搬砖&#xff0c;总少不了需要获取分页数据和总行数。 一直以来的实践是编码两次sql请求&#xff0c;分别拉分页数据和totalCount。 最近我在思考&#xff1a; 常规实践为什么不是 在一次sql请求中中执行多次sql查询或多次更新&#xff0c;显而易见的优势&#xff1a; ① 能…

Halcon 算子汇总

gen_tuple_const(1000,1.5) 生成一个长度为1000&#xff0c;里面每一个数组元素都为1.5的数组 gen_tuple_const(100,chr(ord(a) 1)) 生成一个长度为100&#xff0c;里面每一个数组元素都为b的数组 ord函数是库函数&#xff0c;用于获取字符的ASCII值 chr(ord(a) 1) 结…

8.13-LVS的nat模式+DR模式

LVS 一、nat模式 1.角色 主机名ip地址功能web01192.168.2.101rsweb02192.168.2.102realserveenat内网:192.168.2.103 外网:192.168.2.120directorserver,ntpdns192.168.2.105dns 2..web服务器 [rootweb01 ~]# yum -y install nginx ​ [rootweb01 ~]# echo "web01&qu…

【14】二叉树的Morris等

目录 一.树形dp套路 二.派对的最大快乐值 三.Morris遍历 morris先序遍历 morris中序遍历 moris后序遍历 判断是不是搜索二叉树 四.额外习题 一.树形dp套路 情况1&#xff1a;最大距离&#xff0c;节点X不参与。 > 左树最大距离 or 右树最大距离 情况2&#xff1a;最…

html编写贪吃蛇页面小游戏(可以玩)

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>贪吃蛇小游戏</title><style>body {…

【软件逆向】第2课,软件逆向安全工程师之区分应用32位和64位,每天5分钟学习逆向吧!

目标学习使用StudyPE区分应用 在软件逆向中区分应用类型是关键性的一部分 &#xff0c;只有区分类型后才能选择对应工具进行后续处理。 1.打开StudyPE工具。 2.将我们需要逆向的软件&#xff0c;拖拽到StudyPE中&#xff0c;查看应用信息。 以上用一款视觉AI软件举例&#…

Java设计模式-原型模式-一次性理解透

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1. 前言2. 原型模式的主要角色2.1 原型接口或抽象类2.2 具体原型类2.3 客户端2.4 克隆方法 3. 原型模式使用场景3.1 创建对象是昂贵的3.2 对象的变化3.3 动态配置3.…

【STM32】DMA数据转运(存储器到存储器)

本篇博客重点在于标准库函数的理解与使用&#xff0c;搭建一个框架便于快速开发 目录 DMA简介 DMA时钟使能 DMA初始化 转运起始和终止的地址 转运方向 数据宽度 传输次数 转运触发方式 转运模式 通道优先级 DMA初始化框架 选择开启DMA通道 更改转运次数 DMA应用…

【第二节】80x86汇编-寄存器和标志位

目录 前言 一、汇编相关概念 1.1 数据表示与类型 1.2 汇编语言的构成 1.3 存储器及指令、数据 1.4 存储单元 1.5 CPU对存储器的读写操作 1.6 CPU读写内存单元的过程 1.7 intel CPU发展 1.8 8086 内部结构 二、寄存器 2.1 寄存器概览 2.2 32位寄存器 2.3 16位寄存器…

三维建模软件:地理信息与遥感领域的智慧构建者

在地理信息与遥感技术的广阔舞台中&#xff0c;建模软件如同一位卓越的建筑师&#xff0c;以数据为砖瓦&#xff0c;智慧为水泥&#xff0c;构建出一个又一个又一个逼真、动态的虚拟世界。本文将深入探究其技术核心、应用实例、未来趋势&#xff0c;揭示建模软件如何在地理信息…

《爱情,到此为止》票房大卖 贾斯汀巴尔多尼与布莱克莱弗利的矛盾升级 是真的还是炒作

布蕾克莱弗利&#xff0c;贾斯汀巴尔多尼 布莱克莱弗利凭借电影《我们的末日》在周末取得了票房成功&#xff0c;首映票房收入达 5000 万美元。在电影院困难时期&#xff0c;这是一个了不起的成就&#xff0c;但没有人谈论这一胜利——粉丝们对她与导演兼联合主演贾斯汀巴尔多…

排序(基数,堆,归并)

基数排序 定义0-9十个桶&#xff0c;先排序个数&#xff0c;在排序十位&#xff0c;依次向下&#xff08;桶就是二维数组&#xff09; 按照个位先排一次 个位已经有序了&#xff0c;桶内遵循先进先出 没有十位放到0里 取出 百位 这样排序就完成了。放进取出几次&#xff0c;取…

Flink Checkpoint expired before completing解决方法

在Flink消费Kafka日志的时候出现了这样的一则报错&#xff0c; JobManager报错如下&#xff1a; 2024-03-07 15:21:12,500 [Checkpoint Timer] WARN org.apache.flink.runtime.checkpoint.CheckpointFailureManager [] - Failed to trigger or complete checkpoint 181 for …

Python酷库之旅-第三方库Pandas(082)

目录 一、用法精讲 341、pandas.Series.str.startswith方法 341-1、语法 341-2、参数 341-3、功能 341-4、返回值 341-5、说明 341-6、用法 341-6-1、数据准备 341-6-2、代码示例 341-6-3、结果输出 342、pandas.Series.str.strip方法 342-1、语法 342-2、参数 …

bug的常见排查和分析思路以及相关的原因分类

作为开发人员&#xff0c;经常会收到来自用户和QA&#xff0c;领导反馈的各种问题。 为了快速问题&#xff0c;我们有时需要站在更高的角度&#xff0c;更全面的看待问题。才能更快锁定问题。 具体的bug还需要结合企业实际业务情况&#xff0c;相关的框架&#xff0c;依赖库&…