Day4:Linux系统编程1-60P

我的学习方法是:Linux系统编程(看pdf笔记) + Linux网络编程 + WebServer

01P-17P Linux相关命令及操作

  • cp -a dirname1 dirname2 复制目录

    cp -r dirname1 dirname2 递归复制目录 1 到目录 2

    这里-a 和-r 的差别在于,-a 是完全复制,文件权限,改动时间什么的也完全相同。

  • more filenamecat 差不多,但是对于大文件查看很强势

  • head -n filename 查看文件前 n 行

  • tail -n filename 查看文件后 n 行

  • ln -s file file.s 创建一个软链接(相当于win的快捷方式),最好使用绝对路径

  • ln file file.h 创建一个硬链接,文件和硬链接的 Inode 是相同的,每个文件都有唯一的 Inode(硬链接一改都改,类似于cpp的引用)

  • find命令 -type按种类,-name按名字

  • grep 命令:找文件内容 ,与ps配合使用ps aux | grep 'cupsd'

  • gzip 和 bzip2 都是压缩命令,配合tar使用,rar压缩需要安装rar。

  • ifconfig查看网卡信息

18P - 24P Vim相关(一刷不看)

25P-27P gcc相关

  • gcc中间文件及步骤:

image

28P-37P 动态库和静态库

  • 静态和动态的优劣:静态库在文件中静态展开,所以有多少文件就展开多少次,非常吃内存,但是这样的好处就是静态加载的速度快;使用动态库会将动态库加载到内存,10 个文件也只需要加载一次,然后这些文件用到库的时候临时去加载,速度慢一些,但是很省内存。如何理解动态和静态:静态的写在源代码里的函数,相对 main 函数偏移是一定的,链接时,回填 main 函数地址之后,其他源代码 里的函数也就得到了地址,动态则用plt代替,之后加载的时候再替换掉 )
  • 编译器只能隐式声明返回值为 int 的函数形式:int add(int ,int ); 如果函数不是返回的 int,则隐式声明失效,会报错:在使用自己编写的静态库时,需要在Main中加入函数声明 。但这个方法需要库的使用者知道库里的函数,完事儿一个一个加到代码里,不太行,解决方法:使用头文件加载静态库:这样防止多次展开静态库带来额外开销。

image

38P-40P GDB调试(跳过)

41P-46P Makefile(跳过)

47P-51P 系统调用open

  • 系统调用是内核提供的函数,库调用是程序库中的函数;
  • open() 函数出错时,程序会自动设置 errno,可以通过 strerror(errno)来查看报错数字的含义 以打开不存在文件为例(如果成功fd会返回打开文件所得到对应的 文件描述符)

image

52P-53P 系统调用read/write(复制命令)

  • 系统调用(write/read)和库函数调用(fgetc/fputc)的区别:read每次写n个字节,会疯狂进行内核态和用户态的切换,所以非常耗时。fgetc/fputc,有个缓冲区,预读入缓输出机制。

54P 文件描述符

  • 文件描述符是指向一个文件结构体的指针
  • 在Linux中,文件描述符是一个非负整数,用于标识一个进程正在使用的文件或者其他输入/输出资源。每个进程都有一个文件描述符表,其中存储了该进程打开的文件描述符。标准输入、标准输出和标准错误输出分别使用文件描述符0、1和2。其他文件描述符从3开始递增。文件描述符可以用于读取、写入、关闭文件以及进行其他文件操作。标准输入输出一般指的就是键盘输入/输出;

55P 阻塞和非阻塞

  • 阻塞/非阻塞是设备文件、网络文件的属性(常规文件没有阻塞的概念)。
  • 比如读取dev/tty (这也是个文件),如下写法就是阻塞的:
/* 使用阻塞的read读取终端(标准输入输出)*/
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>int main(){char buf[10];int n;n = read(STDIN_FILENO, buf, 10);if(n < 0){perror("read STDIN_FILENO");exit(1);}write(STDOUT_FILENO, buf, n);return 0;
}

56P-57P 系统调用fcntl

  • fcntl(file control)是一个系统调用,用来改变一个【已经打开】的文件的访问控制属性
  • 函数声明int fcntl(int fd, int cmd, ... /* arg */ ); cmd表示命令,比如下面这句代码将阻塞改为非阻塞:其中F_SETFL设置,F_GETFL获取
    flags = fcntl(STDIN_FILENO, F_GETFL); //获取 stdin 属性信息if(flags == -1){perror("fcntl error");exit(1);}flags |= O_NONBLOCK;int ret = fcntl(STDIN_FILENO, F_SETFL, flags);if(ret == -1){perror("fcntl error");exit(1);}

58P 系统调用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表示错误)

  • 常用作用:使用lseek 获取文件大小、配合truncate拓展文件大小
  • 使用lseek获取文件大小的例子:
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[]) {if (argc != 2) {fprintf(stderr, "Usage: %s <filename>\n", argv[0]);exit(1);}int fd = open(argv[1], O_RDONLY);if (fd == -1) {perror("open error");exit(1);}off_t size = lseek(fd, 0, SEEK_END);if (size == -1) {perror("lseek error");exit(1);}printf("File size: %ld bytes\n", size);close(fd);return 0;
}

59P 传入传出参数

传入参数: 1. 指针作为函数参数。 2. 同常有 const 关键字修饰。 3. 指针指向有效区域, 在函数内部做读操作。

传出参数: 1. 指针作为函数参数。 2. 在函数调用之前,指针指向的空间可以无意义,但必须有效。 3. 在函数内部,做写操作。 4。函数调用结束后,充当函数返回值。

传入传出参数: 1. 指针作为函数参数。 2. 在函数调用之前,指针指向的空间有实际意义。 3. 在函数内部,先做读操作,后做写操作。 4. 函数调用结束后,充当函数返回值。

60P 目录和inode

  • inode:它是文件系统中的一个数据结构,用于存储文件的元数据信息。每个文件在文件系统中都有一个唯一的inode号码,通过这个号码可以访问文件的元数据信息,例如文件的权限、所有者、大小、创建时间、修改时间等等。
  • 在Linux文件系统中,文件名和inode号码是分开存储的。文件名存储在目录中,而inode号码存储在文件系统的inode表中。
  • 一个文件主要由两部分组成,dentry(目录项)和 inode。所谓的删除文件,就是删除 inode,但是数据其实还是在硬盘上,以后会覆盖掉。(参考某些数据恢复措施)

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

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

相关文章

mysql-执行计划

1. 执行计划表概述 id相同表示加载表的顺序是从上到下。 id不同id值越大&#xff0c;优先级越高&#xff0c;越先被执行。id有相同&#xff0c;也有不同&#xff0c;同时存在。 id相同的可以认为是一组&#xff0c;从上往下顺序执行&#xff1b;在所有的组中&#xff0c;id的值…

MYSQL06高级_为什么使用索引、优缺点、索引的设计、方案、聚簇索引、联合索引、注意事项

文章目录 ①. 为什么使用索引②. 索引及其优缺点③. InnoDb - 索引的设计④. InnoDb中的索引方案⑤. 索引 - 聚簇索引⑥. 索引 - 二级索引⑦. B树索引的注意事项⑧. MyISAM中索引方案 ①. 为什么使用索引 ①. 索引是存储引擎用于快速找到数据记录的一种数据结构,就好比去图书馆…

WebGoat 靶场 JWT tokens 四 五 七关通关教程

文章目录 webGoat靶场第 四 关 修改投票数第五关第七关 你购买书&#xff0c;让Tom用户付钱 webGoat靶场 越权漏洞 将webgoat-server-8.1.0.jar复制到kali虚拟机中 sudo java -jar webgoat-server-8.1.0.jar --server.port8888解释&#xff1a; java&#xff1a;这是用于执行…

React18学习

17、React_JSX的注意事项 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>JSX的注意</title><script src"./script/react.development.js"></script><script src"…

Mysql 8手动终止某个事务并释放其持有的锁

示范数据表 age具有index普通索引 在mysql数据库里的information_schema.INNODB_TRX表中存储有innodb的所有事务&#xff0c;我们可以查看该表来查看正在进行的事务 现在我开启一个事务&#xff0c;执行第1、2行SQL&#xff0c;启动事务并持有id3的行锁 刷新事务表可以看到…

大数据软件项目的数据清洗

大数据软件项目中的数据清洗是数据预处理过程中的重要环节&#xff0c;用于识别和纠正数据集中的错误、不一致性和不完整性。虽然没有专门的"数据清洗开发框架"&#xff0c;但有许多工具和库可用于数据清洗任务。以下是一些常见的数据清洗工具和库&#xff0c;可以与…

回顾Softing 2023工博之旅精彩瞬间

2023年9月23日&#xff0c;为期5天的第23届中国国际工业博览会&#xff08;CIIF&#xff09;于上海国家会展中心圆满落幕。Softing作为PROFIBUS创始人之一&#xff0c;德国工业4.0的领军企业之一&#xff0c;在本次展会上向大家呈现了众多工业自动化及IT网络方面的领先产品及方…

大话机器学习准确率(Accuracy)、精确率(Pecision)、召回率(Recall)以及TP、FP、TN、FN

话说三国时期&#xff0c;乱世出人才&#xff0c;当时刘备让张飞帮忙招兵买马&#xff0c;寻找人才。张飞发公告以后&#xff0c;有10人来面试&#xff0c;这10人分为两类&#xff0c;人才和庸才&#xff0c;各占百分之五十&#xff0c;张飞的主要作用就是从这10人中识别出人才…

秋招校招,什么是群面?

时间已经来到十月份&#xff0c;我们也迎来了秋季招聘的高峰期。一般来说&#xff0c;企业为了提高面试的速度&#xff0c;一般都会让我们进行群面。可是&#xff0c;很多人不懂得“群面”的意思&#xff0c;由此导致自己在面试环节丢分。今天&#xff0c;就跟着小编一起来了解…

vscode刷leetcode使用Cookie登录

1、安装插件 打开vscode&#xff0c;选择扩展&#xff0c;搜索leetcode&#xff0c;选择第一个&#xff0c;带有中文力扣字样&#xff0c;安装后重启 2、切换 选择这个小球&#xff0c;切换中文版本&#xff0c;切换后&#xff0c;会显示一个打勾 3、 选择小球旁边的有箭…

解析‘找不到msvcp140.dll无法继续执行代码’这个问题的解决方法

大家好&#xff01;今天我要和大家分享的主题是“msvcp140.dll丢失的解决方法”。我们都知道&#xff0c;在运行一些软件或游戏时&#xff0c;经常会遇到“msvcp140.dll丢失”的错误提示&#xff0c;这会让我们非常烦恼。那么&#xff0c;这个问题是什么原因引起的呢&#xff1…

bigemap在林业勘测规划设计行业的一些应用

选择Bigemap的原因&#xff1a; 主要注重影像的时效性&#xff0c;软件的影像时效性比其他的更新快&#xff0c;更清晰。 使用场景&#xff1a; 1.林业督查&#xff0c;主要是根据国家下发的图斑&#xff0c;结合测绘局的影像以及bigemap的较新影像对比去年和今年的林地变化。…