自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 收藏
  • 关注

原创 [Linux]文件与 fd

文件存储在磁盘中。进程需要读写文件时需要先“打开”文件。“打开”文件的操作其实就是把文件从磁盘加载到内存。因为进程是在CPU上运行的,而根据冯诺依曼体系,CPU无法直接读取到磁盘内容只能直接读取内存,所以读写文件前需要先“打开”文件。进程运行时会默认打开三个输入输出流,在C语言中是stdin(标准输入)、stdout(标准输出)、stderr(标准错误)。

2025-09-21 16:32:41 781

原创 [Linux]进程控制

(1)一个父进程希望复制自己,使父子进程同时执行不同的代码段。比如父进程等待客户端请求,生成子进程来处理请求。(2)一个进程要执行不同的程序。比如 ls 指令传入不同的命令行参数,执行结果也会不同。

2025-09-07 14:39:26 915

原创 [Linux]进程地址空间

我们理所当然的会认为俩进程的数据该保存在不同的地方才对,可是我们却发现他们的地址竟然是相同的,这该怎么理解?当父或子进程要修改一个变量值时,比如子进程修改 a 的值,系统会先重新分配一块物理内存给子进程的 a,把 a 虚拟地址对应的物理地址替换为新物理地址,然后再修改。fork 后的 id 之所以值不同,也是同样的道理,虽然是同一变量名同一虚拟地址,但被操作系统映射到了不同的物理地址,拿到的值自然也就不同。当进程要访问一个变量时,进程会去找变量的虚拟地址,系统会用页表找到对应的真实物理地址进行访问。

2025-07-27 14:54:51 216

原创 [Linux]命令行参数和环境变量

argc 是参数的个数,argv 是参数的清单。main 函数的这两个参数就是命令行参数列表。

2025-07-25 15:15:37 190

原创 [Linux]进程状态、优先级、切换

R 代表运行状态。S 代表的是休眠状态,但是浅睡眠,可中断的睡眠。我们用以下代码观察一下进程的状态:+ 表示这个进程正在前台,那为什么这个程序不是 R 运行状态,而是 S 休眠状态(本质是堵塞状态)呢?因为相对于 IO 是很慢的,这个程序的死循环中,绝大部分时间都用来等待 IO 了,所以往往不会显示为 R 而是 S。

2025-07-23 13:51:54 303

原创 [Linux]进程 / PID

写一个死循环程序执行起来,观察进程ps ajx 显示所有进程用分号可以在命令行的一行中执行多条指令,也可以用 && :ps ajx | head -1 && ps ajx | grep proc终止掉进程后再查看:所以 ./proc 就是死循环程序运行的进程grep --color=auto proc 之所以一直都在,是因为命令行指令执行时也是一个进程ps ajx | grep proc 执行时,grep 指令也变成了一个进程,查询结果自然就会包含在内可以用 grep 的 -v 选项反向搜索来

2025-07-20 19:17:51 878

原创 [Linux]git_gdb

git status 查看仓库状态git add <文件名> 把文件添加到仓库暂存区git commit -m "信息" 把文件加入仓库git push 把本地仓库同步到远端git pull 把远端仓库同步到本地。

2025-07-19 12:40:17 787

原创 [Linux]换行和回车、刷新缓冲区

所以在有 \n 的情况下,输出缓冲区在 printf 执行后立刻被刷新,打印出 hhabchhabc;而没有 \n 的情况下,程序结束时输出缓冲区才被刷新,所以会停止 2 秒之后再打印出 hhabchhabc。程序中的指令 printf 交给 CPU 执行,CPU 不能直接向显示器写入,所以需要在内存中开辟一块空间,用于 CPU 暂时写入,这块内存空间就是输出缓冲区,输出缓冲区中的内容会以刷新的形式显示到显示器上。这是因为命令行也有输出,由于回车符,命令行的输出把 hhabchhabc 覆盖了。

2025-07-16 10:43:57 321

原创 [Linux]假如给我Linux开发工具

make 是一个命令, makefile / Makefile 是一个文件,两个搭配使用,实现项目的自动化构建makefile 定义一系列规则,来指定哪些文件先编译,哪些后编译,哪些重新编译等等,也就是规定了如何去编译代码,生成可执行程序make 是解释 makefile 中指令的命令工具,写好 makefile 后,用 make 指令就可以实现整个工程的自动编译。

2025-06-08 13:00:59 889

原创 [Linux]安装吧!我的软件包管理器!

在 Linux 下安装软件,通常的办法是下载程序的源代码,在自己机子上编译来得到可执行程序。但是这样做有些麻烦,于是就有人把一些常用的软件提前编译好,做成软件包放在一个服务器上,我们通过包管理器可以很方便的获取到这个软件包,直接进行安装。软件包和软件包管理器,就好像手机上的 "app" 和 "应用商店" 间的关系。yum (Yellow Dog Updater, Modified) 是 Linux 下非常常用的一个包管理器,主要应用在 Fedora、RedHat、Centos 等发行版上。

2025-05-18 16:16:54 538

原创 [Linux]重生之我是权限U•ェ•U

超级用户(root)可以在Linux系统中做任何事情,不受限制,命令提示符是 #普通用户在Linux系统中只能做有限的事,命令提示符是 $

2025-05-18 13:56:20 687

原创 [Linux]我在Linux世界觉醒了指令系统

添加新用户 adduser <用户名>更改密码 passwd <用户名>ssh登录 ssh <用户名>@<公网IP>显示当前用户 whoami删除用户 userdel -r <用户名>清屏 clear登出 logout。

2025-05-17 12:36:08 917

原创 【C++入门(7)】vector

vector英文是矢量的意思,但是在C++中,它代表着STL的顺序表。可以看到vector是一个类模板,T指明了一个顺序表的数据类型,allocator是与T相应的空间配置器。用不同的数据类型T创建vector对象,就会得到不同数据类型的顺序表。

2024-10-16 16:43:14 1480

原创 【C++入门(7)】string

C++的string类其实是从C语言的字符串演变过来的,是STL中用于处理字符串的一个容器。在C语言中,字符串是以 '\0' 为结尾的一串字符,为了便于操作,C语言标准库中也提供了不少str系列的库函数供人使用。但是这些库函数是与字符串相分离的,并不符合面向对象编程的思想,而且C语言字符串的底层空间还需要人自行管理,繁琐且存在越界等风险,所以C++中规定了string类,来对C语言的字符串进行“升级”。

2024-10-13 18:35:43 1882 1

原创 【C++入门(6)】类和对象(默认成员函数、运算符重载)

析构函数是在对象生命周期结束时,编译器自动调用的函数,用于清理对象内不能自动释放的数据,比如malloc、realloc、fopen的等。函数名是类名,类名前加~,无返回值,无参数。一个类只能有一个析构函数,如果没有被显式定义,编译器会自动生成一个析构函数。析构函数也不支持重载。编译器自动生成的析构函数,对内置类型不做处理,对自定义类型,调用自定义类型自己的析构函数。

2024-09-25 15:31:23 346

原创 【C++入门(5)】类和对象(初始类、默认成员函数)

int _month;int _day;如果我们没有显式定义构造函数,编译器会自动生成默认的构造函数。C++规定,编译器自默认生成的构造函数,是无参的,并且在函数中,把类型分为内置类型和自定义类型。这个默认生成的构造函数,会对自定义类型,调用这个自定义类型自己的构造函数,而对内置类型,什么都不会做。

2024-09-09 20:35:42 866

原创 【C++入门(4)】引用、内联函数、auto

我们看下面这个例子。我们知道用 double 类型的变量给 int 类型的变量赋值是肯定没问题的,那么到引用时怎么会出现这种情况呢?这是因为这些操作都属于类型转换,而在类型转换时,不论是这样的隐式类型转换,还是强制类型转换,都不是简单的直接将右值赋给左值,而是先创建了一个临时变量来接收右值,再通过这个临时变量,把值赋给左值。这个临时变量是一个常值,可以说是被 const 修饰的。当这个类型转换的语句执行时,编译器先创建了一个这样的常量,里面存放变量b的整数部分的值,再将这个常值赋给变量a。

2024-06-19 23:04:30 1602

原创 探究C语言函数栈帧的创建和销毁

在C语言程序中,每当一个函数被调用时,系统都会在栈上为该函数分配一块内存空间,这块内存空间就被称为栈帧。栈帧中包含了函数执行所需的所有信息,如局部变量、参数、返回地址等。栈帧的创建和销毁是函数调用的核心部分,它们确保了函数能够正确地执行和返回。本文将在VS2013环境下,通过实践操作,对比较简单的C语言程序进行调试的基础上,对C语言函数栈帧的创建和销毁过程进行详细的论述,并探讨函数中局部变量的创建、参数的传递、形参的引用以及返回值等过程。

2024-06-19 20:08:50 1775

原创 【C++入门(3)】函数重载、引用

C语言中不允许同名函数的存在,如果一个程序中有两个函数的函数名完全相同,就会报错。而C++中是允许同名函数的存在的。

2024-06-17 20:37:36 712

原创 【C++入门(2)】输入输出与缺省参数

含缺省参数的函数,声明与定义同时出现时,只需要在函数声明中规定缺省参数,而函数定义中不可以出现缺省参数:这一规定是为了避免出现在函数声明与函数定义中,缺省参数被赋予的初值不同而导致的冲突。

2024-06-14 07:30:00 484

原创 【C++入门(1)】命名空间

我们先简单认识下C++的来历,C++是在C语言的基础上发展来的。当年C++的设计者Bjarne Stroustrup,本贾尼·斯特劳斯特卢普先生设计C语言之初,是为了对C语言做出一些更改,弥补C语言在一些方面的不足,或者做出其他的设计,来让C语言更加适合程序员的使用。简而言之,Bjarne Stroustrup当时只是考虑做些小的补充,然而后来,随着补充工作的逐渐增多,以及一些大的改动,他的“补充版C语言”最终演变成了一门新的语言,也就是C++.

2024-06-13 20:09:30 1025 2

原创 【C语言指针专题(4)】指针与一维数组

这里我们使用 &arr[0] 的方式拿到了数组第一个元素的地址,但是其实数组名本来就是地址,而且 是数组首元素的地址,我们来做个测试。我们发现数组名和数组首元素的地址打印出的结果一模一样,数组名就是数组首元素(第一个元素)的地址。这时候我们可能会有疑问,如果数组名是数组首元素的地址,那下面的代码要怎么理解呢?如果数组名是数组首元素的地址,那么这里的结果应该是4或8,也就是一个地址的大小。但我们已经知道结果是40,是10个整型的大小。这是为什么呢?

2023-12-20 23:56:22 960 1

原创 【C语言指针专题(3)】指针的简单使用(野指针、assert断言、传值调用和传址调用)

assert.h 头文件定义了宏 assert() ,⽤于在运⾏时确保程序符合指定条件,如果不符合,就报错终止运行。这个宏常常被称为“断言”。assert(p!= NULL);上面代码在程序运行到这一行语句时,会验证变量 p 是否等于 NULL。如果确实不等于 NULL,程序继续运行,否则就会终止运行,并且给出报错信息提示。我们知道在函数调用时需要传递参数。传值调用:直接把变量本身传递给函数。传址调用:把变量所在的地址传递给函数。//演示3.1.1int main()int a = 0;

2023-11-25 14:16:21 1823 4

原创 【C语言指针专题(2)】指针的运算

我们知道变量的值是可以随时进行赋值改变的,而当一个变量被const修饰时呢?这里num1是可以被修改并打印的,但是num2是被const修饰的变量,不可更改,对它进行赋值会导致程序报错。然而我们也不是就完全没办法改变num2中的值了。运用指针指向num2再进行解引用,就可以对num2中的值进行修改。这里的目的只是介绍这样一个知识点,但平时编程时并不建议这样做,因为这样实际是在破坏语法规则。

2023-11-25 12:38:14 923 1

原创 【C语言指针专题(1)】简单了解指针

我们已经知道,通过&获取到的地址就是一串十六进制数字,其实也就是一个数据,那么自然而然地也可以像整型、字符、浮点数一样,通过创建一个变量,把这个数据存储到计算机中。C语言中,创建的用于存储地址的变量,就叫做指针变量。//演示2.2.1int main()//创建指针变量pareturn 0;可以看到变量a的地址很好的存放到了指针变量pa中。

2023-11-23 14:21:08 1004 4

原创 水仙花数计算问题

水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”。

2023-11-08 14:15:15 185 4

原创 扫雷游戏(9*9)

在function.c中定义init,用两层for循环对传入的数组进行赋值,赋为传入的指定数值打印传入的数组 ,并在第一行第一列加上坐标数方便寻找雷盘中的指定数利用随机数生成雷的位置,如果这个位置在棋盘内并且还没有布上雷,那么给这个位置的数组值赋为‘1’来代表有雷while循环用来判断su,实现对雷盘的重复排查对输入的坐标进行判断,首先这个数必须在雷盘之中,否则提示坐标错误在while循环中有两个分支,一个是排查坐标刚好有雷,那么要判断游戏失败跳出循环;

2023-11-08 09:20:09 573 5

原创 C语言中如何生成随机数

为了避免出现这种情况,我们需要用srand函数来设置一个“种子”,通过种子的变化,使每次计算的随机数值也变化起来。也就是说,如果每次种子的取值不一样,随机数值就会不一样。时间戳是指从1970年1⽉1⽇0时0分0秒开始,到程序运行为止,所经过的秒数,通过time函数来调用。可以看到两次生成的随机数值是一样的,其原因正是rand函数是靠一个公式来计算一个值作为随机数的。这样我们就可以对上面的代码进行一下改造,让每次程序运行后生成的随机数值不同。这个随机数其实是伪随机数,是通过一定的公式方法计算出来的。

2023-11-01 13:00:56 219 3

原创 猜数字游戏

input变量用于接收游戏开始时对菜单选项的选择,sum变量记录程序执行后总游戏次数,score变量记录游戏中猜中数字消耗的最少次数,num变量用于生成随机数作为需要猜的数字,guess变量用于接收每次猜测的数字,pre变量用于记录一次游戏中猜数字的次数。57到60行进行sum变量和pre变量的比较,取最小值赋给sum,来实现对多次游戏中猜的最小次数的计数。可以重复游戏,程序会记录每次程序启动后游戏的次数,以及猜中数字的最少次数。68到88行实现菜单打印和菜单选项的选择,以及选择后的分支操作。

2023-10-28 15:42:10 170 3

原创 C语言 分支结构

C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构,C语⾔是能够实现这三种结构的,其实我们如果仔细分析,我们⽇常所⻅的事情都可以拆分为这三种结构或者这三种 结构的组合。我们可以使⽤ if 、 switch 实现分⽀结构,使⽤ for 、 while 、 do while 实现循环结构。这里先介绍分支结构。

2023-10-28 14:04:58 144 3

原创 狼找羊问题

一个环型有10个洞,一兔子藏在其中一个洞,某狼钻进第一个洞找不到兔子,就隔一个洞,从第三个洞进去找,还是找不到就隔两个洞,从第六个洞找,找不到就隔三个洞,以此类推.狼一直找不到兔子,问兔子有可能在哪一个洞?

2023-10-26 15:55:30 137 1

原创 C语言内置数据类型介绍

C语言中内置数据类型可以分为四类,分别是:字符型、整型、浮点型和布尔类型。

2023-10-25 12:58:44 351 4

原创 C语言学习:C语言常见概念

C语言常见概念介绍

2023-10-14 17:55:44 271 8

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除