- 博客(81)
- 收藏
- 关注
原创 for循环语句
在C语言中,除了使用while和do…while实现循环外,for循环也是最常见的循环结构,而且其语句更为灵活,不仅可以用于循环次数已经确定的情况,还可以用于循环次数不确定而只给出循环结束条件的情况,完全可以代替while语句,其语法格式如下所示。for(赋初始值;循环条件;迭代语句){ 语句1; ...... 语句n;}当执行for循环语句时,程序首先指定赋初始值操作,接着执行循环条件,如果循环条件的值为真时,程序执行循环体内的语句,如果循环条件的值为假,程序则直接跳出循环
2021-08-23 09:01:22
285
原创 while循环语句
while循环语句是循环结构的一种,其一般的形式如下所示。while(循环条件){ 循环体}while语句首先会检验括号中的循环条件,当条件为真时,执行其后的循环体。每执行一遍循环,程序都将回到while语句处,重新检验条件是否满足。如果一开始条件就不满足,则不执行循环体,直接跳过该段代码。如果第一次检验时条件满足,那么在第一次或其后的循环过程中,必须有使得条件为假的操作,否则循环将无法终止。while循环语句的执行流程如图所示。...
2021-08-23 08:58:42
202
原创 机器语言概念
机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指令的集合。机器语言具有灵活、直接执行和速度快等特点。一条指令即机器语言的一个语句,它是一组有意义的二进制代码,指令的基本格式包含操作码字段和地址码字段,其中操作码字段指明了指令的操作性质及功能,地址码字段指定了操作数或操作数的地址。不同型号的计算机其机器语言是不相通的,按照一种计算机的机器指令编制的程序,不能在另一种计算机上执行。用机器语言编写程序,开发人员要首先熟记所用计算机的全部指令代码和代码的涵义。开发人员除了需要处理每条指令和每个数据
2021-08-13 17:49:23
3085
原创 数组初始化
数组的初始化是指在定义数组时进行数组元素赋值,其初始化的语法格式如下:数据类型 数组名[数组元素个数] = {值1, 值2, …, 值n};(1)对数组全部元素赋初值,示例代码如下:int a[4] = {1, 2, 3, 4}; 在定义数组的同时将常量1、2、3、4分别置于数组元素a[0]、a[1]、a[2]、a[3]中,还可以写成“int a[] = {1, 2, 3, 4};”。特殊地,全部元素都为0,可以写成 “int a[4] = {0};”,等价于“int a[4] = {0, 0,
2021-07-02 18:00:12
3176
原创 数组的定义
在C语言中使用变量必须先进行定义,数组也不例外,下面介绍如何定义一个数组,其语法格式如下:数据类型 数组名[常量表达式]其中,数据类型可以是任一种基本数据类型或构造数据类型。数组名是用户定义的数组标识符。方括号中的常量表达式表示数据元素的个数,也称为数组的长度。示例代码如下:int i[10];其中i是数组的名字,其中“[ ]”它是一维数组的标识,方括号中的10表示可容纳10个变量,而int则代表变量的类型为整型。定义不同类型的数组,具体示例如下:int a[10]; // 数组名a,有
2021-07-02 17:58:57
1070
原创 while循环
while循环语句是循环结构的一种,其一般的形式如下所示。while(循环条件){ 循环体}while语句首先会检验括号中的循环条件,当条件为真时,执行其后的循环体。每执行一遍循环,程序都将回到while语句处,重新检验条件是否满足。如果一开始条件就不满足,则不执行循环体,直接跳过该段代码。如果第一次检验时条件满足,那么在第一次或其后的循环过程中,必须有使得条件为假的操作,否则循环将无法终止。while循环语句的执行流程如图所示。...
2021-06-21 09:30:12
1380
原创 2021-06-21
在C语言中,除了使用while和do…while实现循环外,for循环也是最常见的循环结构,而且其语句更为灵活,不仅可以用于循环次数已经确定的情况,还可以用于循环次数不确定而只给出循环结束条件的情况,完全可以代替while语句,其语法格式如下所示。for(赋初始值;循环条件;迭代语句){ 语句1; ...... 语句n;}当执行for循环语句时,程序首先指定赋初始值操作,接着执行循环条件,如果循环条件的值为真时,程序执行循环体内的语句,如果循环条件的值为假,程序则直接跳出循环
2021-06-21 09:16:12
62
原创 C语言的优点
对于操作系统中的应用程序以及需要对硬件进行操作的场合,用C语言明显优于其它高级语言,许多大型应用软件都是用C语言编写的,其主要特征如下。简洁紧凑、灵活方便C语言一共只有32个关键字,9种控制语句,程序书写自由,主要用小写字母表示,它把高级语言的基本结构、语句与低级语言的实用性结合起来。运算符丰富C语言的运算符包含的范围很广泛,共有34个运算符。C语言将括号、赋值、强制类型转换等作为运算符处理,从而使C的运算类型极其丰富表达式类型多样化,灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。数
2021-05-27 20:55:25
1061
原创 C语言标准
随着微型计算机的日益普及,出现了许多C语言版本。由于没有统一的标准,使得这些C语言之间出现了一些不一致的地方。为了改变这种情况,美国国家标准学会(ANSI)于1989年为C语言制定了一套ANSI标准,即C语言标准ANSI X3.159-1989,被称为C89。之后在1990年,国际标准化组织ISO也接受了同样的标准ISO9899-1990,该标准被称为C90。这两个标准只有细微的差别,因此,一般而言C89和C90指的是同一个C语言标准。在ANSI标准化发布了C89标准以后,C语言的标准在一段时间内都保持不
2021-05-27 20:52:46
254
原创 块设备驱动程序2
1 #include <linux/init.h> 2 #include <linux/kernel.h> 3 #include <linux/module.h> 4 5 #include <linux/fs.h> 6 #include <linux/slab.h> 7 #include <linux/genhd.h> 8 #include <linux/blkdev.h> 9 #include <.
2021-03-05 18:28:06
78
原创 块设备驱动程序
1 #include <linux/init.h> 2 #include <linux/kernel.h> 3 #include <linux/module.h> 4 5 #include <linux/fs.h> 6.
2021-03-05 18:26:57
102
原创 IIC总线
IIC总线由SCL(串行时钟线)和SDA(串行数据线)两条线组成,其上连接有主机控制器(Master,Linux设备驱动中称为Adapter)和从设备(Slave)。所有的访问操作都是由主机控制器发起的,在同一条总线上可以有多个主机控制器,当多个主机控制器同时对设备发起访问时,由协议的冲突检测和仲裁机制来保证只有一个主机控制器对从设备进行访问。多个从设备是通过从设备的地址来区分的,地址分为7位地址和10位地址两种,常见的为7位地址。当SCL为高电平,SDA由高电平变为低电平时,表示起始信号,主机控制器开始
2021-01-31 22:01:31
298
原创 总线
任何一个处理器都要与一定数量的部件或外围设备连接,但如果各部件和外围设备都分别用一组线路与CPU直接连接,那么连线将会错综复杂,甚至难以实现。为了简化硬件电路设计以及系统结构,计算机系统采用使用一组线路,配置以适当的接口电路,与各部件、外围设备相连,这组共用的连接线路就是总线。采用总线结构便于部件和外围设备的扩充,特别是指定了统一的总线标准使不同设备实现互连。总线(Bus)是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束。按照计算机所传输的信息种类,计算机的总线可以划分为数据总线、
2021-01-31 22:00:10
143
原创 GIC检测中断的流程
GIC的分配器Distributor为每一个中断都维护了一个状态机,这些中断状态包括Active(正在处理)、Inactive(停止处理)、Pending(挂起)、Active and pending(处理与挂起),具体如图所示。结合图所示的中断状态转换,GIC检测中断的流程如下。(1)当GIC检测到一个中断产生时,会将中断标记为Pending状态(A1)。(2)GIC分配器Distributor从Pending状态的中断中选择一个优先级最高的中断,发送到确定的CPU Interface中。(3)
2020-11-16 08:22:55
1279
原创 按键抖动
按照正常的逻辑,按键从按键按下到抬起的过程中,任何中断触发方式(高/低电平触发、上升/下降沿触发)都只会产生一次,其电平变化如图所示。而在实际的情况中,按键产生的电平变化与图所示的理论电平变化具有一定差异,这是因为通常按键所用的开关都是机械弹性开关。当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会立刻稳定接通,在断开时不会立刻彻底断开,而是在闭合和断开的瞬间伴随着一连串的抖动。实际的电平状态变化如图所示。如图所示,按键稳定闭合时间长短是由操作人员决定的,通常会在100ms以上
2020-11-16 08:20:02
2317
原创 块设备
块设备对数据的处理是按照数据块的形式进行的。在大多数Linux操作系统中,进行I/O操作块设备时,每次只能传输一个或多个完整的块,而每块包含512字节(或更2的更高次幂)的数据。Linux可以让应用程序像字符设备一样读写块设备,允许一次传递任意多字节的数据。块设备和字符设备的区别仅仅在于内核内部管理数据的方式,也就是内核及驱动程序之间的软件接口,而这些不同对用户来讲是透明的(在内核中,字符驱动程序与块驱动程序具有完全不同的接口)。块设备具有请求缓冲区并且支持随机访问,不必按照顺序去存取数据。Linux下的磁
2020-09-21 08:39:29
673
原创 字符设备
字符设备对数据的处理是按照字节流的形式进行的,可以支持随机访问,也可以不支持随机访问。字符设备驱动程序通常至少要实现open、close、read、write等系统调用。字符设备可以通过文件系统节点(设备节点)来访问,这些设备文件和普通文件之间的唯一差别在于对普通文件的访问可以移动或定位访问位置,而大多数字符设备只能按照顺序访问数据。通常情况下,对字符设备只能按顺序按字节进行存取而不能随机访问(字符设备没有请求缓冲区,所有的访问请求都是按顺序执行的),但事实上现在一些高级字符设备也可以从指定位置一次读取一
2020-09-21 08:38:25
301
原创 内核模块与应用程序的区别
内核模块与普通的应用程序存在很大的差异,具体如下。(1)内核模块属于操作系统内核的一部分,运行在内核空间,应用程序运行在用户空间。(2)内核模块中的函数是被动调用的,如加载函数与卸载函数分别是在内核模块被加载和卸载时被调用,而应用程序则是顺序执行。(3)内核模块不能调用C库,应用程序可以随时调用C库。(4)内核模块必须要做一些清除性工作,如在卸载函数中将申请的内存空间释放,而应用程序忽略有些工作不会对系统造成影响,如应用程序执行结束前会自动释放使用的内存空间,因此释放内存的操作出现在程序结束前是可以
2020-09-14 08:44:47
2152
1
原创 内核模块的结构
一个完整的内核模块应该由以下结构组成。(1)模块加载(入口)函数(必需)。(2)模块卸载函数(必需)。(3)模块许可证声明(必需)。(4)模块参数(可选)。(5)模块导出符号(可选)。(6)模块作者等信息声明(可选)。...
2020-09-14 08:43:19
224
原创 内核模块
内核模块的编写有一定的格式要求,这样模块才能被内核识别,即加载成功。如例所示,为一个简单的内核模块程序。```c```c 1 #include <linux/init.h> 2 #include <linux/module.h> 3 #include <linux/kernel.h> 4 5 int init_module(void){ 6 printk(KERN_INFO "module init\n"); 7 return 0;
2020-08-02 11:00:31
145
原创 Linux内核模块概述
Linux操作系统的内核为单一体系结构(单内核),其与微内核(如Windows操作系统)的最大区别在于所有的内核功能都被编译在一起,成为一个单独的镜像文件。单内核的优点是效率非常高,内核中各个功能模块的交互是通过直接的函数调用来进行的。而微内核则只实现内核中关键和核心的一部分,其他的功能模块单独编译,功能模块之间的交互由微内核提供的通信机制来建立。对于Linux的单内核而言,其缺点就是要增加或删除内核的某种功能,将不得不重新编译整个内核,然后再重新启动,这对于驱动开发前期是非常不友好的。为了弥补这一缺点,L
2020-08-02 10:54:27
175
原创 PHP基础语法-变量与作用域
php变量及变量作用域变量规则:$+变量名其中变量名命令规则是字母/数组/下划线****,且不能以数字开头具体形式如下所示:<?php$txt = "hello world";?>变量作用域作用域–php中有4中不同的作用域local /global /static / parameter<?php//变量的基本命名方式使用$$a = 4;e...
2020-01-10 18:26:57
100
原创 PHP语法格式
基本语法格式**php属于脚本文件,该文件的以“.php”结尾。文件中需要进行简单的声明文件前需要使用“<php”开头,使用"?>"结尾。php语言的语句需要使用分号进行块划分。php语言使用双斜杠“//”进行单行注释php语言使用双斜杠“/* */”进行多行注释具体示例代码如下所示。...
2020-01-10 18:24:56
481
原创 文本编辑器简介
文本编辑器在操作系统中扮演着十分重要的角色,不论是配置系统文件还是编写程序代码都需要借助于文本编辑器来完成。不同的操作系统中存在不同的文本编辑器,例如,TextMate(Mac平台)、Notepad++(Windows平台)等。虽然这些文本编辑器的最基本需求都是用来编辑文件,但其内部设计的细节却不尽相同,因此也形成了各自独有的特色。Linux操作系统中有许多独有且非常优秀的文本编辑器,按照其功能...
2019-12-29 17:45:27
979
原创 软件包管理工具
Linux系统主要支持RPM和Deb两种软件包管理工具。RPM(Redhat Package Manager)是一种用于互联网下载包的打包及安装工具。虽然这一名称包含Redhat的标志,但是其原始设计理念是开放的,不仅可以在Redhat平台上使用,也可以在SUSE上使用。RPM包的依赖性很强,安装也较繁琐,因此本章将着重介绍常用的Deb软件包管理工具。Linux系统为用户提供了各种不同层次和类型...
2019-12-29 17:43:47
799
原创 linux用户相关配置文件
/etc/passwdLinux系统中的每个用户都在“/etc/passwd”文件中有一个对应的记录行,它记录了这个用户的基本属性。当用户登录时,系统会查询这个文件,确认用户的UID并验证用户口令。文件中的内容如下所示。 1 root:x:0:0:root:/root:/bin/bash 2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh 3 bin:x:...
2019-12-22 17:03:57
179
原创 linux用户
Linux是多用户多任务的操作系统,所谓多用户多任务是指,多个用户可以在同一时间内登录同一个系统执行各自不同的任务,而互不影响。不同用户则权限不同,通过这种权限的划分和管理,实现了多用户多任务的运行机制。了解用户的属性,主要是以下5个方面。用户名用户名是代表用户账号的字符串,通常不超过8个字符。口令口令是登录账号的密码。虽然用户的口令一般为加密串,而非明文。但是存放用户信息的文件“/e...
2019-12-22 17:01:38
78
原创 线性表的运算
线性表的运算指的是对线性表中的数据进行操作,其具体的实现与线性表的物理结构有关。线性表常见的几种运算如下。(1)置空:将线性表变成空表。(2)求长度:获取线性表数据结点的个数。(3)取结点:取出线性表中的某个数据结点。(4)定位:获取某一个指定的数据结点。(5)插入:将数据结点插入到线性表的指定位置。(6)删除:删除线性表中的指定数据结点。上述运算并非线性表的所有运算,且上述运算也不...
2019-12-14 11:57:41
958
原创 线性表定义
线性表中的数据元素之间满足线性结构。线性表是n个数据元素的有限序列,记为(a_1, a_2, a_3, ・・・, a_n),其概念分析如下。(1)n为数据元素的个数,也可以称为线性表的长度,当n为0时,线性表称为空表。(2)a_i为线性表中的第i个数据元素(也可以称为数据结点),i称为数据元素在线性表中的位序(等同于数组元素的下标)。从线性表的定义可以看出,线性表中存在唯一的首个数据元素a_...
2019-12-14 11:56:15
481
原创 Shell预定义变量
预定义变量即Shell已经定义的变量,用户可根据Shell的定义直接使用这些变量,无需自己定义。所有预定义的变量都由$符和其他符号组成,常用的预定义变量如下所示。(1)$#:表示命令行参数的个数。(2)$@:包含所有的命令行参数,即“$1、$2、$3......”。(3)$?:前一个命令的退出状态,正常退出返回0,反之为非0值。(4)$*:包含所有的命令行参数,即“$1、$2、$3.......
2019-12-02 08:52:51
1127
原创 Shell命令行参数
Shell编程中的命令行参数(位置参数)与C程序中的main函数传参类似。这些位置参数使用$N表示,N为正整数,表示命令行传入的第N个参数。N从0开始进行标记,与C语言中的数组表示的方式相同。例如,$1表示传递给脚本程序的第一个参数,并依此类推。$0表示程序本身的名字。命令行参数使用如例所示。 1 #! /bin/sh 2 3 VAR=$1 #将变量$1的值赋...
2019-12-02 08:50:03
1289
原创 Shell中的自定义变量
Shell脚本中的变量不支持数据类型(整型、字符型等),任何赋值给变量的值都被Shell解释为一串字符。变量的命名需要遵循以下规则。(1)命名只能使用字符、数字和下划线,首个字符不能以数字开头。(2)命名不能出现空格,可以使用下划线。(3)不能使用Shell中已经定义的关键字。(4)通常使用全大写的变量,便于识别。变量赋值的格式如下所示。变量名=值上述赋值的格式中,需要注意的是,...
2019-11-25 09:15:11
684
1
原创 linux操作系统中与用户相关的配置文件
/etc/passwdLinux系统中的每个用户都在“/etc/passwd”文件中有一个对应的记录行,它记录了这个用户的基本属性。当用户登录时,系统会查询这个文件,确认用户的UID并验证用户口令。文件中的内容如下所示。 1 root:x:0:0:root:/root:/bin/bash 2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh 3 bin:x:...
2019-11-25 09:06:10
1453
原创 正则表达式一点通
正则表达式在生活中也有应用。例如,人们在移动端APP或一些PC平台中注册账号时,一般都会被限制用户名的设置。有些平台的用户名只允许使用字母、数字或下划线,并且规定了用户名的长度,从而保证所有注册的用户名都具有一定的规则。对于这样的限制,则可以使用正则表达式来设定。如图所示,为实现用户名限制的表达式及解析,即用户名为6~20位字符组成(允许使用字母、数字、下划线)。按照所示的规则设置用户名,例...
2019-11-17 15:36:20
125
原创 Shell函数
在实际的程序编程中,开发者通常将具有固定功能且多次使用的一组命令(语句)封装在一个函数中,当需要使用该功能时只需调用该函数即可。在Shell中同样可以使用函数,需要注意的是,函数在调用前必须先定义。调用程序可以传递参数给函数,函数可用return语句将运行后的结果返回给调用程序。函数的定义函数定义的方式如下所示,与C语言程序中的函数类似。func_name(){command1....
2019-11-17 15:33:57
380
原创 Shell脚本的执行方式
Shell脚本文件无需编译,只需要由解释器解析即可。因此,修改权限后的脚本文件可直接执行。执行Shell脚本有以下3种方式。作为可执行程序执行脚本文件test.sh,如例所示。./test.shlinux@ubuntu:~/1000phone$ ./test.sh //执行脚本文件hello world //脚本文件的输出结果linux...
2019-11-08 20:23:43
302
转载 正则表达式小练习
1、匹配整数或者小数(包括正数和负数)-?\d+(.\d+)?-?表示-匹配0次或一次,\d表示整数,+表示匹配一次或多次,(.\d+)?表示小数2、匹配年月日日期 格式2018-12-61\d{0,3}-(1[0-2]|0?[1-9])-(3[01]|[12]\d|0?[1-9])$1.[1-9]表示年是以数字1-9开头的,\d{0,3}表示年的位数,[1-9]\d{0,3}就表示1-...
2019-11-08 20:19:23
379
原创 子网掩码
子网掩码也可称为网络掩码。用户通过子网掩码可以很快确认当前主机IP所属的网络类型,其一般的组成为:网络地址部分为“1”,主机地址部分为“0”。 因此,A类地址的子网掩码为255.0.0.0;B类地址的子网掩码为255.255.0.0;C类地址的子网掩码为255.255.255.0。子网掩码的主要作用是判断主机发送的数据包是发送给外网还是内网。主机A向主机B发送数据包,则主机A先将自己的子网掩码与...
2019-10-14 09:05:46
1391
原创 Shell概述
Shell可直译为“贝壳”,而Linux中的Shell就可以被视为Linux内核的一个外层保护工具。主要负责完成用户与内核之间的交互,其主要面对的是用户。Shell本质是一个命令行解释器。其功能为将用户命令解析为操作系统所能理解的指令,从而实现用户与操作系统的交互。Shell为操作系统提供了内核以上的功能,直接用来管理和运行系统。在这里需要特别注意的是Shell、Shell脚本、命令三者的区别...
2019-10-14 09:04:20
292
原创 僵尸进程
什么是僵尸进程,僵尸进程其实是进程的一种状态,即僵尸态。在3.1.3节中,介绍了僵尸态进程的形成。进程的僵尸态与死亡态很接近。唯一不同的是死亡态进程,即进程退出,释放所有资源;而僵尸态进程,即进程退出,但其资源没有得到释放。因此在实际的编程过程中,应尽量关注这一点,避免产生僵尸态的进程,因为僵尸态进程不执行任何任务,但却占有系统资源。如果僵尸态进程太多,则会导致系统浪费。下面将通过一个示例,展示僵...
2019-09-23 08:52:00
506
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人