1.Java并发编程笔记之LinkedBlockingQueue源码探究
2.STM32F103正点原子学习笔记系列——高级定时器
3.在bat格式的量递量 TXT文件中。输入设么 使得能够读取我想要读取的减源减缩或者网站
4.源码解析:shared_ptr是如何实现共享对象所有权的?
5.stmia是什么协议?
6.图解Go里面的WaitGroup了解编程语言核心实现源码
Java并发编程笔记之LinkedBlockingQueue源码探究
LinkedBlockingQueue 是基于单向链表实现的一种阻塞队列,其内部包含两个节点用于存放队列的码递首尾,并维护了一个表示元素个数的量递量原子变量 count。同时,减源减缩它利用了两个 ReentrantLock 实例(takeLock 和 putLock)来保证元素的码递web实战项目源码原子性入队与出队操作。此外,量递量notEmpty 和 notFull 两个信号量与条件队列用于实现阻塞操作,减源减缩使得生产者和消费者模型得以实现。码递
LinkedBlockingQueue 的量递量实现主要依赖于其内部锁机制和信号量管理。构造函数默认容量为最大整数值,减源减缩用户可自定义容量大小。码递offer 方法用于尝试将元素添加至队列尾部,量递量若队列未满则成功,减源减缩返回 true,码递反之返回 false。若元素为 null,则抛出 NullPointerException。put 方法尝试将元素添加至队列尾部,并阻塞当前线程直至队列有空位,若被中断则抛出 InterruptedException。通过使用 putLock 锁,确保了元素的原子性添加以及元素计数的原子性更新。
在实现细节上,offer 方法通过在获取 putLock 的同时检查队列是否已满,避免了不必要的元素添加。若队列未满,则执行入队操作并更新计数器,同时考虑唤醒等待队列未满的线程。此过程中,通过 notFull 信号量与条件队列协调线程间等待与唤醒。
put 方法则在获取 putLock 后立即检查队列是否满,若满则阻塞当前线程至 notFull 信号量被唤醒。在入队后,更新计数器,并考虑唤醒等待队列未满的线程,同样通过 notFull 信号量实现。
poll 方法用于从队列头部获取并移除元素,若队列为空则返回 null。此方法通过获取 takeLock 锁,保证了在检查队列是否为空和执行出队操作之间的原子性。在出队后,计数器递减,并考虑激活因调用 poll 或 take 方法而被阻塞的线程。
peek 方法类似,但不移除队列头部元素,返回 null 若队列为空。此方法也通过获取 takeLock 锁来保证操作的原子性。
take 方法用于阻塞获取队列头部元素并移除,若队列为空则阻塞当前线程直至队列不为空。此方法与 put 方法类似,通过 notEmpty 信号量与条件队列协调线程间的等待与唤醒。
remove 方法用于移除并返回指定元素,若存在则返回 true,否则返回 false。此方法通过双重加锁机制(fullyLock 和 fullyUnlock)来确保元素移除操作的原子性。
size 方法用于返回当前队列中的元素数量,通过 count.get() 直接获取,确保了操作的准确性。
综上所述,LinkedBlockingQueue 通过其独特的锁机制和信号量管理,实现了高效、线程安全的阻塞队列操作,适用于生产者-消费者模型等场景。
STMF正点原子学习笔记系列——高级定时器
高级定时器简介:TIM1/TIM8包含位递增、递减、中心对齐计数器(0至),具备位预分频器(分频系数1至)。它们用于触发DAC与ADC,并在更新事件、触发时间、输入捕获、输出比较时产生中断/DMA请求。高级定时器提供4个独立通道,用于输入捕获、输出比较、输出PWM及单脉冲功能。高级定时器能够根据外部信号控制,支持编码器和霍尔传感器电路。此外,它们具备重复计数器功能、可编程的商用php源码互补输出、断路输入以实现用户自定义的安全配置。
高级定时器框图展示其内部结构,包括计数器、预分频器、中断控制单元、通道配置、输出控制等关键组件。
高级定时器输出指定个数PWM实验通过设置重复计数器RCR实现。除最后一个PWM输出外,其余PWM输出仅需配置RCR值,更新事件会在RCR+1次溢出时触发。
高级定时器输出指定个数PWM实验原理:确保在进行PWM输出时,将MOE(输出使能)设置为1,并在TIMx_BDTR寄存器中配置互补输出功能。在初始化函数中调用相关HAL库函数配置定时器实例、预分频器、重复计数器值等关键参数。然后配置GPIO和定时器中断,开启PWM输出。通过中断函数,根据需要触发更新事件,并控制PWM计数器。
课堂源码与例程的区别在于,课堂源码通过调用HAL库中断处理函数并进入回调函数,而例程直接在中断函数内进行用户代码编写,跳过了HAL库的中断处理流程。
高级定时器输出比较模式实验涉及PWM周期由ARR决定,占空比固定为%,相位由CCRx控制。配置相关HAL库关键结构体实现输出比较模式,包括初始化定时器实例、配置比较模式、输出极性、比较值等,通过设置定时器的比较寄存器值来控制PWM占空比。
高级定时器互补输出带死区控制实验包括H桥应用,通过增加死区时间控制避免元器件延迟导致的输出冲突。设置MOE为1开启输出,配置死区时间、刹车功能和输出空闲状态,实现互补输出和死区控制。
高级定时器PWM输入模式实验涉及通道1和通道2的使用,通过TIM3CH2输出PWM,将PWM输入到TIM8CH1进行测量。配置采样频率、PSC和ARR以确保准确的测量结果,并通过HAL库函数实现输入捕获功能。中断服务函数负责读取计数器值和捕获事件。
在bat格式的 TXT文件中。输入设么 使得能够读取我想要读取的或者网站
bat如何是c语言?
从零学批处理
在很多人印象中,DOS时代已经远去了,在拥有豪华界面和强大功能的Windows时代,很少有人去用DOS的方法来解决一些问题,或者用DOS命令去玩电脑。其实在Windows时代,DOS仍然有着非常巨大的用处。看着大虾们把简单的DOS命令写成批处理就可以自动进行网络入侵、清除病毒、恢复系统……大大简化某些工作,这一定让你羡慕不已了吧?本文就教你如何去学习和使用批处理,如何让自己也成为一名来自DOS时代的大虾。
一、初识批处理:
“批处理”一词来源于上个世纪的年代,批处理技术最早被应用在早期的操作系统的设计上。当时的计算机系统非常昂贵,为了提高资源利用律,增加系统的吞吐量,人们设计了一种可以按照某种顺序依次将作业从外存中调入内存去执行的操作系统,这就是多道批处理系统,好处是可以在作业调度中不需要人工参与,实现了简单的自动化。多道批处理的形成标志了操作系统的诞生。
小知识:“作业”指需要使用计算机来完成的某项工作。早期的“外存”一般为磁带,接着出现了软盘,现代的外存除了包括早期的外,还包括硬盘、光盘、移动存储设备等。“内存”只指插在计算机主板上的内存条。
在后来出现的bilibili开源码DOS操作系统里,这种自动化被更好的体现出来。DOS系统允许用户使用任何一种文本编辑器将多条DOS命令按某种顺序以ASCⅡ文本的形式写入一个扩展名为.bat(MS-DOS批处理)或.cmd(Windows NT 命令脚本)的文件中,当在命令提示符下键入文件名并回车,或者在Windows环境中双击该文件时,系统会调用command.com或cmd.exe由前向后依次来自动执行这些命令。这个命令的集合就是批处理,它是DOS下可执行文件的一种。一个完整的批处理由至少一条可以被正确执行的DOS命令组成,可见DOS命令是批处理的核心。
小知识:“命令提示符”是指在DOS系统下或DOS窗口中出现的X:\>符号,X指当前的驱动器号。在命令提示符后可以直接输入命令,回车后该命令就被执行。DOS下的可执行文件,除了批处理专用的.bat和.cmd以外,还有.exe和.com,这四种文件是直接可以DOS被执行的。
也有一种说法,把批处理称做“脚本”,或者合起来称为“批处理脚本”,这也是合理的。批处理和脚本有一个共同点,他们都是通过一组命令的正确执行来实现自身价值的,不同之处在于,批处理使用的全部为DOS命令,而在脚本中可以使用应用程序的指令;脚本的程序性强于批处理,批处理的程序结构比较简单。
小知识:“指令”是指组成某一命令的最小单位,其执行过程不能再分。一条命令由多多条指令组成。
打开任何一种文本编辑器——如记事本,在里面写下如下代码,然后保存为一个扩展名为.bat或.cmd的文件,就形成了一个批处理。
例一,.bat
@ echo off
if exist C:\name.gif del C:\name.gif
exit
注意:在下文的介绍中,部分例子只给出关键代码。
该批处理的作用,是检查是否存在C:\name.gif文件,如果存在就删除该文件。整个代码分为三行,因此可以理解为有三条DOS命令组成的,而第一条命令又由多条子命令组成。整段代码的执行顺序由@命令开始到exit命令结束。
注意:如果一条命令是用连接符号将多个命令连接而成的复合命令,则称该复合命令中的每一条命令为它的“子命令”。
为了进一步说明批处理的结构,再用一个例子初步介绍批处理。
例二,.bat:
@echo off & cls
if "%1"=="" goto usage
if "%1"=="/?" goto usage
if "%1"=="help" goto usage
pause
masm %1.asm
if errorlevel 1 pause & edit %1.asm
link %1.obj & %1
:usage
echo Usage: This BAT file name [source filename]
echo Default BAT file name is START.BAT
汇编程序从源代码到可执行文件必须经过汇编和连接两个过程,这就是一个将汇编程序源代码自动转换为.exe可执行文件的批处理。2、3、4行和最后两行的作用是显示程序用法帮助,中间是程序主体部分。首先用masm程序对.asm源代码进行汇编,如果正确,再用link命令对汇编生成的.obj目标文件进行连接,从而生成.exe可执行文件。如果在汇编时出错,则打开源代码进行修改。在本例中使用了masm.exe、link.exe两个汇编的专用程序。可见,批处理的应用是十分灵活的,结合其他应用程序,只要是想的到的它都能做的到。
小知识:可以在键盘上按下Ctrl+C组合键来强行终止一个批处理的执行过程。
由于功能强大的DOS操作系统由它的所有命令组成,所有的DOS命令又都可以被用在批处理中,各命令的使用方式、参数等都和单独使用该命令时一样,所以决定了批处理可以完成所有DOS能完成的工作,还具备了DOS没有的优势:可以让命令按顺序自动执行。所以在Windows时代,批处理仍然可以在各种场合发挥作用,甚至有时利用批处理可以大大简化工作过程,提高工作效率。用好用活批处理,完全可以让你的电脑操作上一个新的台阶,老树也可以开新花。改mysql源码
二、常用批处理命令:各个常用命令
批处理的核心,是各种DOS命令,以及如何将它们巧妙组合,这需要读者朋友有一定的DOS基础,有灵活的思路和清晰的头脑,至少读者应该知道并且用过一些最基本的DOS内部命令,因为所有在批处理中专用的命令都是DOS的内部命令。下面本文将分三类由简单到复杂来介绍常用的批处理命令。
小知识:“内部命令”是指无程序体的命令,这些命令在任何DOS环境都可以执行,它们被包含在command.com或cmd.exe文件里,如例二中的echo、if、pause、goto等都是内部命令。在命令提示符下输入help后回车,就可以看到常用的内部命令。“外部命令”需要有自己独立的程序体,如例二中的edit命令就是外部命令,它们的程序体分别是edit.exe。而masm.exe和link.exe是应用程序,只要在DOS中可以运行,就可以把任何应用程序当作DOS命令来使用。
批处理的基本命令@、echo、::和rem、pause、call、:和goto、setlocal和endlocal
批处理命令中很多是基本命令,它们在批处理中应用十分普遍,几乎任何一个批处理中都可以找到它们的踪迹。下面将依次介绍这些命令。
1、@命令。
@符号是E-mail的专用符号,它在批处理中的作用是让系统在执行批处理命令时不显示该行命令本身。通俗一点说,当某一行命令最前面使用了该名,这一行的命令就不在执行过程中显示了。在例一首行的@echo off中,@的作用就是让批处理在执行时不显示后面的echo off部分。请读者结合后面的echo命令理解使用。
2、echo命令。
echo命令是一个开关命令,它只有on和off两中状态,一般出现在批处理第一行中,它的作用是保证批处理在执行时不显示它后面所有命令本身,只显示执行中的结果或其他信息,用法为:ECHO[ON|OFF]。可见,echo命令和@命令的区别在于前者关闭了所有命令本身,而后者只关闭其中一样。例一第一行中,将echo命令和@命令结合起来使用,达到了两个目的:不显示echo off命令本身,不显示以后各行中的命令本身。
echo命令还有其他特别的用法,比如用来在批处理执行过程中显示一段信息,用法为:ECHO[消息内容],见如例二中最后两行,echo后面的所有内容将被显示到屏幕上。还可以结合管道命令将显示的信息写进某个文件中,这样就可以使用echo命令来直接编辑文本文件了。后面将详细介绍。
3、::和rem命令。
::和rem命令的作用和用法都完全一样,用来在批处理中做注释,增加程序的可读性。它们的用法很简单,直接将注释内容写到::或rem后面就可以了。注释的内容可以为任意ASC字符(甚至一条命令),它们是不会在执行时显示出来,或被执行的。但需注意的是,使用::或rem命令做注释,一般都是另提一行来写的,这样显得规范且不易出错。jquery键盘源码
4、pause命令。
该命令在批处理中使用十分广泛,其作用是暂停批处理的执行,直到用户按下键盘上的任意键(Break键除外)。批处理在执行过程中显示的所有信息都是一闪而过的,只有当用户暂停执行时,才可以看到当前屏幕上的信息。当程序要让用户看一段信息,或要给用户时间去考虑某个问题的时候,就可以在这里加上一个pause,批处理执行到这里时将显示“按任意键继续”的信息。用法很简单,直接在要暂停的地方使用pause命令即可,见例二中pause用法。
注意,如果要让pause命令执行后的“请按任意键继续”的提示不出现,可以这么些pause >nul。同理其他命令执行后的提示如果不想显示,都可以这么写,在后面跟上>nul即可。
5、call命令。
该命令是用来从一个批处理中调用另一个批处理的,用法为:CALL [驱动器][路径]批处理名[参数]。使用此命令,可以实现多个批处理互相调用,类似于程序中各个模块之间的互相调用。例如有两个批处理名分别为.bat和.cmd,在.bat里有如下命令:
call .cmd name.txt
.bat执行到此句时,自动停止后面命令的执行,而转到执行.cmd,name.txt作为.cmd的参数。关于批处理中使用参数的详细用法,后面将详细介绍。
6、:和goto命令。
这是两个成对出现的命令,在任何一个批处理中有多少个:就一定至少有多少个gogo。goto命令的作用,是告诉程序并不按顺序向下执行,而是要跳转到另一个地方,而:标识符则唯一标记了goto命令要跳转的地址。简单来说,goto是个跳转命令,而:是一个标签。当程序运行到goto时,将自动跳转到:所标记的地方去执行。用法举例见例二。
注意:goto命令的标签长度不能超过8个字节,否则可能会出错。即thistest0和thistest的效果是一样的,批处理只取前8个字节,即thistest。
7、setlocal和endlocal命令。
这两个命令也是成对出现的,用来对批处理执行过程中的环境变量进行临时修改和操作,当执行过endlocal或关闭批处理后环境变量仍为系统原先设置的值。例如系统环境变量设置了Windows文件夹的目录为C:\Windows,而在批处理执行过程中要设置Windows文件夹的目录为D:\Windows,这就可以使用设置环境变量的命令在setlocal和endloacl之间进行重新设置,这个设置只限于该批处理执行过程中,是一个临时设置。一般情况下setlocal和endlocal两个命令在批处理中使用并不广泛。
小知识:所谓“环境变量”,是指包含诸如驱动器、路径或文件名之类的字符串,它控制着各种程序在执行时的外部环境,如临时文件位置等。可以使用“控制面板”——“系统”——“高级”——“环境变量”或使用set命令对环境变量进行修改。
复杂命令if、set、shift、for
复杂命令本身比较难掌握,但它们功能强大,在批处理中的应用是十分广泛的,它们是批处理中各种重要功能实现的基础。熟练这些命令才可以让写出的批处理实现想要的功能。
8、if命令。
懂得程序的朋友都知道,if命令在各种程序中都有使用,而且用的十分普遍。在批处理中,if命令和其他程序语言中的作用基本一样,都是代表“如果……就……”,是一个选择判断命令,或者说条件命令。在批处理中,if命令的使用也十分普遍,凡是牵扯到分支结构的地方都要使用if命令。
if命令判断程序执行时条件是否满足,如果满足就执行一个操作,不满足就执行另一种操作,条件可以是单个,也可以是多个的。根据if命令判断的对象,可将其分为三类:
(1)、输入判断,用法为:IF [NOT] string1==string2 command
在批处理执行时,可以为其赋予一个或多个参数,如何根据输入参数的不同来决定批处理执行不同的命令呢?使用if命令的输入判断就可以实现。
例三,.bat:
if "%1"=="1" goto tern1
if "%1"=="2" goto tern2
:tern1
echo 输入为1
:tern2
echo 输入为2
%1在批处理中代表参数,后面将专门介绍。当输入参数为1时,执行term1部分的命令,参数为2时就执行term2部分的命令。通常情况下,为了使批处理更像一个标准的程序,也可以把该批处理的用法写进去,查看方式跟查看DOS命令的用法相同,实现代码见例二的2、3、4行和最后三行。
(2)、存在判断,用法为:IF [NOT] EXIST filename command
该用法可以为if命令指定一个文件名,当该文件存在时判断结果为真,否则为假。存在判断用法比较简单,如见例一。
定义范围内的目录进行,执行时要使用/d参数。假设要在当前目录中建立文件名分别为a、b、c的三个目录,则执行如下命令:for /d %i in (a,b,c) do md %i。该过程相当于依次执行md a、md b和md c。
如果在(set)中使用*作为统配符,则可以设置操作对象为当前目录下的所有文件夹,也可以使用?符号来指定部分名称的文件夹为操作对象。如果要删除这三个目录则可执行:for /d %i in (*) do rd %i。
(2)、目录树操作:
该操作针对指定的根目录树的每一层子目录进行for命令,执行时需要使用/r参数。如果没有指定目录,则默认为当前目录。假设要查看指定目录中的所有目录及子目录中的文件详细信息,则执行如下命令:for /r e:\games %i in (.) do dir %i > info.txt。这样相当于在每个目录及子目录中都执行了dir命令,然后将所有的执行结果都写到info.txt文件中。
(3)、数值范围操作:
该操作通过对(set)部分的特殊指定,可以生成一个数字序列来作为command的执行范围,执行时需要使用/l参数。假设要生成所有三位数的有序序列,则可以利用for命令的/l参数方便实现。
例六,.bat:
@echo off
for /l %%i in (,1,) do echo %%i >> number.txt
if errorlevel 0 echo All done.
这样就将到之间所有的数字按递增顺序写到number.txt中,每行一个数字。在该操作的(set)部分中,前、后两个数字指定数字序列的最小和/或最大值,中间的数字代表生成序列的方式,1代表递增,-1代表递减。若将(set)中的和互换位置,会将到之间的数按递减顺序排列并写到number.txt文件中。
(4)、文件解析:
该操作是for命令最难最烦琐的操作,用来对定义范围内的文件内容、字符串以及其他命令的输出进行处理,执行时要使用/f参数。要.txt文件中的所有空行去掉,则执行如下命令:for /f %i in (.txt) do echo %i >> .txt。这样就会将.txt内容中不为空的所有行写入到.txt文件中,因为/f参数默认不处理文件中的空行。
在该操作中,可以为/f参数再带上更多选项来实现更丰富的功能。在选项中可以定义被处理文件的其他条件,例如从第n行开始处理、行结尾如果是指定字符就跳过、指定每行的第那些字符被参数取代等。
for命令的用法十分灵活多变,有的甚至十分复杂,限与篇幅,这里不再深入介绍,本文在后面还将对for命令的高级用法做出举例。
批处理作为DOS下的可执行文件,可以加入参数以扩大它的功能。批处理参数以一个%符号后紧跟一个数字组成,批处理在执行时,自动用紧跟在批处理文件名后面的字符串或文件来依次替换该批处理内部的参数。如果一个批处理文件test.bat以这样的方式执行:test a name.txt,则在执行过程中,批处理自动从代码中寻找%1并用a代替,%2用代替,%3用name.txt代替。
批处理参数的表示,只允许出现%0-%9(其中%0代表调用该批处理本身)但有时需要在批处理中使用超过%9的参数,或者使用数目不定的参数,就必须使用shift命令。shift命令的作用就是修改参数在批处理文件中的位置。
例七,.bat:
@echo off
:getfile
if "%1"=="" goto exit
copy %1 C:\Windows\
shift
goto getfile
:exit
该批处理的作用,是复制任意多的文件file1、file2……到c:\windows\目录中,假设有三个文件要复制,执行.bat file1 file2 file3。程序先判断是否存在第一个参数,存在则复制第一个文件,然后执行shift命令,准备第二次复制。在第二次中,由于执在第一次执行了shift命令,所有的%1都被替换成了%2,执行过程变为先判断第二个参数是否存在,存在则复制第二个文件,然后再执行一次shift命令来完成从%3到%2的替换。依次类推。在使用shift命令实现不定数目的参数替换功能时(如本例),必须要注意执行shift命令的时机,如果选择不当则不能达到目的,甚至会出现死循环的情况。这需要不断的摸索,进一步理解shift命令的用法。有关批处理参数的用法后面还有详解。
其他命令在批处理中常用的DOS命令。
从本文开始就在强调,各种DOS命令是批处理的核心和基础,只有掌握好各种DOS命令,才可能将它们灵活的运用到批处理中,熟练使用DOS命令是玩转批处理的必要条件。在批处理中常用的DOS命令还有以下这些:
copy、dir、del、type、path、set等内部命令,net、ping、cmd、at、sort、attrib、fc、choice等外部命令。
小知识:内部命令是指包括在command.com(系统)或cmd.exe(以上系统)里的命令。比如你打开CMD命令行,输入help并回车,显示出来的所有命令都是内部命令,它们都被包括在cmd.exe这个文件里了。外部命令是指有独立文件的命令,比如net和ping命令都是外部命令,在system目录下可以找到net.exe和ping.exe文件。
如何学习DOS命令不是本文介绍的内容,几乎任何一个DOS命令都可以在命令提示符下输入“命令名 /? | more”来查看其帮助。
三、高级批处理命令:
认识了批处理中常用的命令,如果读者认为批处理就这些内容的话,那就大错特错了。批处理还有功能更特殊用法更精妙的命令,还有更强大的功能和潜力等待着我们去挖掘。高级命令分为组合命令、管道命令和重定向命令。
组合命令&、&&、||
顾名思义,组合命令实际上是一个有意义的连接符,用来连接多条命令。将多条子命令用这种连接符连接起来放在一行去当作一个命令执行,这在批处理中是允许的,而且使用十分广泛。
、&命令。
&命令是最简单的组合命令,它的作用是连接多条子命令,不管前面的命令是否执行成功,后面的命令都将按顺序依次执行完毕。用法为:COMMAND1 & COMMAND2 & COMMAND3……
例八,.bat:
del a.tmp & echo All done! & pause
例八中的这句命令由三条子命令组成,它们依次执行,任何一个命令的执行结果都不影响其他子命令的执行。
、&&命令。
&&命令也是用来连接多条子命令的,用法与&命令相同,不同之处在于,它在从前往后依次执行被它连接的几个子命令时会自动判断是否有子命令执行出错,一旦发现某个子命令执行出错,该子命令后面的全部命令都将被忽略。这样,将某些在特定条件下不必执行的命令用&&命令连接在它的条件后面,当条件不正确时就不执行后面的命令了。
例九,.bat:
dir file://IP/www/user.mdb && copy file://IP/www/user.mdb e:\backup\user.mdb
先用dir命令查看远程主机上user.mdb文件是否存在,执行成功后(文件存在)就用copy命令复制到本地,否则不执行copy命令。
、||命令。
||命令同样用来连接多条子命令,用法同前两种组合命令完全一样,但它的作用跟&&命令刚好相反,当多条子命令中只要有一个可以成功执行(&&命令是执行出错),后面的所有子命令将被忽略。
例十,.bat:
dir .exe || dir .exe || echo No virus found! & pause
echo Found Virus! & goto clean
假设.exe和.exe是同一个病毒的两个文件,先用dir .exe命令检查文件.exe是否存在,如果不存在(执行不成功)就继续执行dir .exe检查.exe是否存在,如果存在.exe就显示发现病毒,并跳转程序到清除病毒部分。
管道命令|
、|命令。
管道命令用来实现将一个命令的输出信息和另一个命令的输入相连接,类似与从管道中传递实体。用户只能看到最后的结果而不能看到它们之间通信的过程,因为这个过程是在管道中进行的。在批处理中使用管道命令,可以让命令之间互相通信,而将中间过程透明化,因此作用十分巨大。
小知识:操作系统中把“管道”定义为连接一个读进程和一个写进程以实现它们之间通信的文件,这个“文件”是在内存中建立的,当信息传递结束后它也随之消失,所以是不可见的。
|命令用来实现两个命令之间的管道,它将前一命令的输出作为后一命令的输入,这种用法比较特殊,但却很高效。可以分两步来理解|命令:先将前一命令执行后的结果输出到内存的某一地址,再让后一个命令从该地址来取输入信息。在这两步之间,这个被两个命令共同使用的内存就相当于管道。
例十一,.bat:
ype code.txt | debug
想将一个保存在code.txt中的代码让dubug程序来执行,不必先打开debug,再将code.txt的内容粘贴在里面后执行,只需要利用这个管道命令就可以实现。先用type命令在内存中显示code.txt的内容(type命令的输出),然后将这些输出作为debug的输入内容传递给debug。
重定向命令>和>>、<、>&和<&
、>和>>命令。
>和>>命令又被称为输出重定向命令,它们的作用是一样的,都是将前一命令的输出写到一个文件中。在批处理中,它们往往被用来将某些信息保存到一个文件中。
例十二,.bat:
dir /s e:\ > a.txt
这条命令用来得到一份E盘的目录和详细文件列表,并保存到a.txt文件中。先用dir/s命令将E盘的目录列出来(在内存中),然后用>重定向命令将该部分内存的内容写到a.txt中。>命令写文件的方式是从文件第一行开始,直到写完管道中的内容,原来文件的起始部分将被覆盖。所以如果要在同一个文件中再写进去F盘的详细文件列表,就要使用>>命令了,因为>>命令是从文件在最后一行,将管道中的信息追加进去的。
例十三,.bat:
dir /s e:\ > a.txt
dir /s f:\ >> a.txt
可见,>命令和>>命令的不同之处在于前者是从文件的第一行开始覆盖,而后者是从文件的最后一行开始追加。
、<、<&和>&命令。
这三个命令一般不常用,本文只作简单介绍,有兴趣的读者可以通过其他途径深入学习:
<,输入重定向命令,从文件中读入命令输入,而不是从键盘中读入。
>&,将一个句柄的输出写入到另一个句柄的输入中。
<&,刚好和>&相反,从一个句柄读取输入并将其写入到另一个句柄输出中。
应用在批处理中的所有命令基本上都在前面介绍了,但光依靠这些命令还不足以让批处理发挥其所有的功能。批处理在执行时还可以被加进去参数,还可以利用批处理来操作注册表……
四、批处理的综合应用:
批处理参数的应用
参数在批处理中的应用十分广泛,很多情况下如果不使用参数,其功能将无法完成。参数中,%0表示该批处理文件名,相当于对该批处理自身的一次调用;%1-%9表示在执行时用加入的参数代替。如果参数多于9个,则需要使用shift命令来处理多出的参数。
例十四,.bat:
@echo off
net use \\%1\ipc$ "%3" /u:"%2"
goto result%errorlevel%
:result0
echo host=%1
echo username=%2
echo username=%3
pause
:result2
假设该批处理文件名为ipc.bat,则执行时在命令行输入ipc ..0. administrator password
批处理操作注册表
一般情况下,操作注册表的方法是直接打开注册表编辑器对其操作,还有一种是利用导入的方法来操作注册表,将要编辑的注册表内容写到一个文件中,然后将该文件执行导入内容。使用批处理也可以对注册表进行操作,利用的原理就是导入。
注意:注册表包含了计算机中每个用户的配置文件、有关系统硬件的信息、安装的程序及属性设置,Windows 在其运行中不断引用这些信息。在操作注册表前最好先对其进行备份,以免因操作不当造成难以预测的后果。
结合管道命令>和echo命令就可以将注册表内容写到一个文件中,最后利用regedit命令导入就可以了。
例十四:
@echo off
rem This REGfile close all shared entity.
echo Windows Registry Editor Version 5. > name.reg
echo. >>name.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters] >> name.reg
echo "AutoShareServer"=dword: >> name.reg
echo "AutoShareWks"=dword: >> name.reg
echo.
regedit /s
该例的作用,是通过修改注册表来达到禁止默认共享的目的。在该例中,使用echo命令显示一个字符串,然后用>命令将此字符串重定向到name.reg文件中,最后利用regedit命令将name.reg文件的内容写到注册表里。如果为Windows系统,则.reg文件的第一行应修改为REGEDIT4,顶格大写。
注意:echo命令后不空格而紧跟一个小圆点,作用是显示一个空行,且显示空行的前提是必须执行过echo off命令。.reg文件第二行和最后一行的两个空行必须存在,它是注册表文件的固定格式。
不清楚的地方可以到批处理论坛提问。/或者。本篇文章由ArtiPub自动发布平台发布。
Python实现十大经典排序算法--python3实现(以及全部的排序算法分类)
我简单的绘制了一下排序算法的分类,蓝色字体的排序算法是我们用python3实现的,也是比较常用的排序算法。
一、常用排序算法
1、冒泡排序——交换类排序
1.1 简介
冒泡排序(Bubble Sort)是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。最快:当输入的数据已经是正序时;最慢:当输入的数据是反序时。
1.2 源码
1.3 效果
2、快速排序——交换类排序
2.1 简介
快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。特点是选基准、分治、递归。
2.2 源码
2.3 快排简写
2.4 效果
3、选择排序——选择类排序
3.1 简介
选择排序是一种简单直观的排序算法。无论什么数据进去都是 O(n²) 的时间复杂度。
3.2 源码
3.3 效果
4、堆排序——选择类排序
4.1 简介
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。分为两种方法:大顶堆、小顶堆。平均时间复杂度为 Ο(nlogn)。
4.2 源码
4.3 效果
5、插入排序——插入类排序
5.1 简介
插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了。工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
5.2 源码
5.3 效果
6、希尔排序——插入类排序
6.1 简介
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。基于插入排序的原理改进方法。
6.2 源码
6.3 效果
7、归并排序——归并类排序
7.1 简介
归并排序(Merge sort)采用分治法(Divide and Conquer)策略,是一种典型的分而治之思想的算法应用。
7.2 源码
7.3 效果
8、计数排序——分布类排序
8.1 简介
计数排序的核心在于将输入的数据值转化为键存储在额外的数组空间中。要求输入的数据必须是有确定范围的整数,运行时间是 Θ(n + k),不是比较排序,性能快于比较排序算法。
8.2 源码
8.3 效果
9、基数排序——分布类排序
9.1 简介
基数排序是一种非比较型整数排序算法,可以用来排序字符串或特定格式的浮点数。
9.2 源码
9.3 效果
、桶排序——分布类排序
.1 简介
桶排序是计数排序的升级版,它利用了函数的映射关系,高效与否的关键在于映射函数的确定。桶排序关键在于均匀分配桶中的元素。
.2 源码
.3 效果
三、Github源码分享
写作不易,分享的代码在 github.com/ShaShiDiZhua...
请点个关注,点个赞吧!!!
2024-11-18 14:49
2024-11-18 14:18
2024-11-18 13:57
2024-11-18 13:49
2024-11-18 13:44
2024-11-18 13:12
2024-11-18 12:20
2024-11-18 12:19