首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Shell编程看懂到看开②(字符串、数组、注释、流程控制、read读取控制台输入)

@TOCShell字符串字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。...="NEFU is a good university"echo ${string:0:4} # 输出 unoostring:0:4:代表字符串的第0索引往后截取四位查找子字符串我们在NEFU is...读取数组读取数组元素值的一般格式是:${数组名[下标]}例如:valuen=${array_name[n]}使用 @ 符号可以获取数组中的所有元素,例如:echo ${array_name[@]}获取数组的长度获取数组长度的方法与获取字符串长度的方法相同...中一样这里的[]可以用(())代替,这样我们使用比较符的时候更加方便图片输出结果:图片until循环当判断式条件不成立时执行until [ 条件判断 ]do程序段落donebreak循环控制break语句用于for...==基本语法==read (选项) (参数)选项:p:指定读取值时的提示符;t:指定读取值时等待的时间(秒)如果-t 不加表示一直等待参数:变量:指定读取值的变量名==案例实操==[root@hadoop101

60620
您找到你想要的搜索结果了吗?
是的
没有找到

零拷贝技术原理以及实现

由于软件层面也是需要去获取io数据,去创建进程线程的,这个时候,使用语言的函数调用,就会去调用系统的内核函数,用户态转换成内核态执行.  例如以下代码: <?... world";//用户态转内核态,用户态获取字符串,转到内核态缓冲区并输出. } else {     $data = file_get_contents("http://www.php20.cn"...);     //1:首先程序将网址等,转换成http协议头     //2:将http协议头字符串程序缓冲区复制到系统内核socket缓冲区     //3:socket缓冲区复制到网卡发送     ...: - io相关操作,设置时钟指令,内存操作(申请内存,清理内存) - 终端,异常,陷入等 - 进程/线程 管理 - 系统调用,调用硬件等 - 用户内存地址的转换,由程序地址转为物理地址映射 零拷贝...,将数据读取拷贝到内核空间中 ,第一次拷贝 2:将内核空间的内存地址以及偏移量传输到socket缓冲区中 3:socket直接内核空间读取数据 4:将内核空间的数据通过socket复制到网卡中,第二次拷贝

64320

运维必读:Linux 的内存分页管理

内存用内存地址(memory address)来为每个字节的数据顺序编号。因此,内存地址说明了数据在内存中的位置。内存地址0开始,每次增加1。...用十六进制表示,32位地址空间就是0x00000000 到0xFFFFFFFF。 内存的存储单元采用了随机读取存储器(RAM, Random Access Memory)。...我们已经知道,进程需要调用内存中不同位置的数据。如果数据读取时间和位置相关的话,计算机就很难把控进程的运行时间。因此,随机读取的特性是内存成为主存储器的关键因素。...每个进程都有自己的一套虚拟内存地址,用来给自己的进程空间编号。进程空间的数据同样以字节为单位,依次增加。功能上说,虚拟内存地址和物理内存地址类似,都是为数据提供位置索引。进程的虚拟内存地址相互独立。...多层分页表还有另一个优势。单层分页表必须存在于连续的内存空间。而多层分页表的二级表,可以散步于内存的不同位置。这样的话,操作系统就可以利用零碎空间来存储分页表。

1.1K30

架构师必读:Linux 的内存分页管理

内存用内存地址(memory address)来为每个字节的数据顺序编号。因此,内存地址说明了数据在内存中的位置。内存地址0开始,每次增加1。...用十六进制表示,32位地址空间就是0x00000000 到0xFFFFFFFF。 内存的存储单元采用了随机读取存储器(RAM, Random Access Memory)。...我们已经知道,进程需要调用内存中不同位置的数据。如果数据读取时间和位置相关的话,计算机就很难把控进程的运行时间。因此,随机读取的特性是内存成为主存储器的关键因素。...每个进程都有自己的一套虚拟内存地址,用来给自己的进程空间编号。进程空间的数据同样以字节为单位,依次增加。功能上说,虚拟内存地址和物理内存地址类似,都是为数据提供位置索引。进程的虚拟内存地址相互独立。...多层分页表还有另一个优势。单层分页表必须存在于连续的内存空间。而多层分页表的二级表,可以散步于内存的不同位置。这样的话,操作系统就可以利用零碎空间来存储分页表。

1.5K10

架构师必读:Linux 的内存分页管理

内存用内存地址(memory address)来为每个字节的数据顺序编号。因此,内存地址说明了数据在内存中的位置。内存地址0开始,每次增加1。...用十六进制表示,32位地址空间就是0x00000000 到0xFFFFFFFF。 内存的存储单元采用了随机读取存储器(RAM, Random Access Memory)。...我们已经知道,进程需要调用内存中不同位置的数据。如果数据读取时间和位置相关的话,计算机就很难把控进程的运行时间。因此,随机读取的特性是内存成为主存储器的关键因素。...每个进程都有自己的一套虚拟内存地址,用来给自己的进程空间编号。进程空间的数据同样以字节为单位,依次增加。功能上说,虚拟内存地址和物理内存地址类似,都是为数据提供位置索引。进程的虚拟内存地址相互独立。...多层分页表还有另一个优势。单层分页表必须存在于连续的内存空间。而多层分页表的二级表,可以散步于内存的不同位置。这样的话,操作系统就可以利用零碎空间来存储分页表。

58200

Linux 的内存分页管理

内存用内存地址(memory address)来为每个字节的数据顺序编号。因此,内存地址说明了数据在内存中的位置。内存地址0开始,每次增加1。...用十六进制表示,32位地址空间就是0x00000000 到0xFFFFFFFF。 内存的存储单元采用了随机读取存储器(RAM, Random Access Memory)。...我们已经知道,进程需要调用内存中不同位置的数据。如果数据读取时间和位置相关的话,计算机就很难把控进程的运行时间。因此,随机读取的特性是内存成为主存储器的关键因素。...每个进程都有自己的一套虚拟内存地址,用来给自己的进程空间编号。进程空间的数据同样以字节为单位,依次增加。功能上说,虚拟内存地址和物理内存地址类似,都是为数据提供位置索引。进程的虚拟内存地址相互独立。...多层分页表还有另一个优势。单层分页表必须存在于连续的内存空间。而多层分页表的二级表,可以散步于内存的不同位置。这样的话,操作系统就可以利用零碎空间来存储分页表。

1.1K30

架构师必读:Linux 的内存分页管理

内存用内存地址(memory address)来为每个字节的数据顺序编号。因此,内存地址说明了数据在内存中的位置。内存地址0开始,每次增加1。...用十六进制表示,32位地址空间就是0x00000000 到0xFFFFFFFF。 内存的存储单元采用了随机读取存储器(RAM, Random Access Memory)。...我们已经知道,进程需要调用内存中不同位置的数据。如果数据读取时间和位置相关的话,计算机就很难把控进程的运行时间。因此,随机读取的特性是内存成为主存储器的关键因素。...每个进程都有自己的一套虚拟内存地址,用来给自己的进程空间编号。进程空间的数据同样以字节为单位,依次增加。功能上说,虚拟内存地址和物理内存地址类似,都是为数据提供位置索引。进程的虚拟内存地址相互独立。...多层分页表还有另一个优势。单层分页表必须存在于连续的内存空间。而多层分页表的二级表,可以散步于内存的不同位置。这样的话,操作系统就可以利用零碎空间来存储分页表。

54920

1.1 熟悉x64dbg调试器

EDX 通用寄存器,用于存放内存地址或其他通用数据。 ESI 通用寄存器,用于存放源数据的地址,例如字符串拷贝等操作。...硬件读取断点 - 当程序尝试指定内存地址读取数据时,触发硬件读取断点。这种断点类型适用于在特定内存位置上调试程序,例如检测某个变量的值何时被更改。...在x64dbg中,硬件读取断点可以通过在指定内存地址上设置“r”来实现。硬件写入断点 - 当程序尝试向指定内存地址写入数据时,触发硬件写入断点。...在x64dbg中,硬件写入断点可以通过在指定内存地址上设置“w”来实现。图片(3)内存断点当程序在特定内存地址读取、写入或执行时,暂停程序执行。...内存读取断点(Read breakpoint):当程序试图特定内存地址读取数据时触发,可以用于检测对敏感数据的窃取、防止非法读取程序代码等。

51830

Linux的内存分页管理

内存用内存地址(memory address)来为每个字节的数据顺序编号。因此,内存地址说明了数据在内存中的位置。内存地址0开始,每次增加1。...用十六进制表示,32位地址空间就是0x00000000 到0xFFFFFFFF。 内存的存储单元采用了随机读取存储器(RAM, Random Access Memory)。...我们已经知道,进程需要调用内存中不同位置的数据。如果数据读取时间和位置相关的话,计算机就很难把控进程的运行时间。因此,随机读取的特性是内存成为主存储器的关键因素。...每个进程都有自己的一套虚拟内存地址,用来给自己的进程空间编号。进程空间的数据同样以字节为单位,依次增加。功能上说,虚拟内存地址和物理内存地址类似,都是为数据提供位置索引。进程的虚拟内存地址相互独立。...多层分页表还有另一个优势。单层分页表必须存在于连续的内存空间。而多层分页表的二级表,可以散步于内存的不同位置。这样的话,操作系统就可以利用零碎空间来存储分页表。

1.4K10

Linux的内存分页管理

内存用内存地址(memory address)来为每个字节的数据顺序编号。因此,内存地址说明了数据在内存中的位置。内存地址0开始,每次增加1。...用十六进制表示,32位地址空间就是0x00000000 到0xFFFFFFFF。 内存的存储单元采用了随机读取存储器(RAM, Random Access Memory)。...我们已经知道,进程需要调用内存中不同位置的数据。如果数据读取时间和位置相关的话,计算机就很难把控进程的运行时间。因此,随机读取的特性是内存成为主存储器的关键因素。...每个进程都有自己的一套虚拟内存地址,用来给自己的进程空间编号。进程空间的数据同样以字节为单位,依次增加。功能上说,虚拟内存地址和物理内存地址类似,都是为数据提供位置索引。进程的虚拟内存地址相互独立。...多层分页表还有另一个优势。单层分页表必须存在于连续的内存空间。而多层分页表的二级表,可以散步于内存的不同位置。这样的话,操作系统就可以利用零碎空间来存储分页表。

1.3K20

1.1 熟悉x64dbg调试器

EDX 通用寄存器,用于存放内存地址或其他通用数据。 ESI 通用寄存器,用于存放源数据的地址,例如字符串拷贝等操作。...硬件读取断点 - 当程序尝试指定内存地址读取数据时,触发硬件读取断点。这种断点类型适用于在特定内存位置上调试程序,例如检测某个变量的值何时被更改。...在x64dbg中,硬件读取断点可以通过在指定内存地址上设置“r”来实现。硬件写入断点 - 当程序尝试向指定内存地址写入数据时,触发硬件写入断点。...在x64dbg中,硬件写入断点可以通过在指定内存地址上设置“w”来实现。图片(3)内存断点当程序在特定内存地址读取、写入或执行时,暂停程序执行。...内存读取断点(Read breakpoint):当程序试图特定内存地址读取数据时触发,可以用于检测对敏感数据的窃取、防止非法读取程序代码等。

59120

1.1 熟悉x64dbg调试器

堆栈窗口有两个重要的作用,一个是用于调用函数时的参数传递,另一个作用是函数内部的变量局部空间,函数内定义的变量和临时变量都存储在堆栈中,当函数返回时,这些变量会自动销毁。...硬件读取断点 - 当程序尝试指定内存地址读取数据时,触发硬件读取断点。这种断点类型适用于在特定内存位置上调试程序,例如检测某个变量的值何时被更改。...在x64dbg中,硬件读取断点可以通过在指定内存地址上设置“r”来实现。 硬件写入断点 - 当程序尝试向指定内存地址写入数据时,触发硬件写入断点。...在x64dbg中,硬件写入断点可以通过在指定内存地址上设置“w”来实现。 (3)内存断点 当程序在特定内存地址读取、写入或执行时,暂停程序执行。...内存读取断点(Read breakpoint):当程序试图特定内存地址读取数据时触发,可以用于检测对敏感数据的窃取、防止非法读取程序代码等。

63130

你看到的所有地址都不是真的

举个例子,比如说当程序执行了一条加载指令,指令内容是物理地址 4 中读取 4 字节字传送到某个寄存器中。...再举个例子,摘自《现代操作系统 - 第 3 版》: 一个程序给物理内存地址 1000 赋值也就是存入了一些数据后,另一个程序也同样给这个地址赋值,那么第二个程序的赋值会覆盖掉第一个程序所赋的值,这会造成两个程序同时崩溃...毕竟如果各个进程之间可以随意读取、写入内容的话那就乱套了。 那么如何对每个进程使用的地址进行保护(protection)呢?...就是说每个进程的栈啊、堆啊、代码段啊等等它们的实际物理内存地址对于这个进程来说是不可见的,谁也不能直接访问这个物理地址。 那我们怎么去访问这个进程呢?...每个进程都拥有一个自己的地址空间,并且独立于其他进程的地址空间。也就是说一个进程中的虚拟地址 28 所对应的物理地址与另一个进程中的虚拟地址 28 所对应的物理地址是不同的,这样就不会发生冲突了。

41530

c语言指针学习

当使用80386时,我们必须区分以下三种不同的地址:逻辑地址、线性地址、物理地址;在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址(偏移地址...指针可以指向这个内存地址,也可以指向另一个内存地址,当指针指向一个内存地址,它们之间才发生联系,通过这个指针去操作这块内存,所以指针把我们带入到地址层面去操作数据,在php,java 这些高级语言没有这一层的操作...start++ < end--) { temp = *start; *start = *end; *end = temp; } } 上面的例子是指针的角度去处理字符串...,我再revstr 函数中定义了两个指针,一个指针指向字符串的首地址,另一个指针指向字符串的末地址,把内容互换。...看一下p3 会有一个值,未初始化指针是有内存地址的,而且是一个垃圾地址。不知道这个内存地址指向的值是什么。这就是为什么不要对未初始化指针取值的原因。

2.2K10

刑】(一)使用c#+Win32Api实现进程注入到wechat

简而言之,就是主模块是的地址就是索引0,而其他变量信息可能在5,7,9等等,我们就需要判断0到5有多少间隔,这个就叫偏移量,我们通过属性或者方法的内存地址减去主模块的地址,这个就是我们的偏移量,借这个例子就是...VirtualAllocEx,给指定的进程分配虚拟内存,第一个参数是进程的句柄,OpenProcess返回值,第二个参数指定进程内那个内存地址分配的内存,此处我们只是加载dll调用方法,并不注入到某个方法或者哪里所以是...ReadProcessMemory,读指定进程的内存,第一个参数进程句柄,OpenProcess返回值,第二个参数是这个进程某个内存的地址,第三个是数据缓冲区,读取之后的内容就在这个缓冲区,我们读取这个缓冲区就可以拿到数据...等int值,这个其实就是我们在CE拿到的静态数据的内存地址,减去我们的Wechatwin.Dll的出来的偏移量,然后定义了我们各个静态数据的缓冲区,用来读取微信进程读取的内存数据。...然后我们调用了ReadProcessMemory函数读取内存,获取我们需要的静态数据。然后使用Utf8转为字符串,显示到界面上。

53220

Ptrace使用

其父进程应该希望跟踪子进程 PTRACE_PEEKTEXT, 内存地址读取一个字节,内存地址由addr给出 PTRACE_PEEKDATA, 同上 PTRACE_PEEKUSER, 可以检查用户态内存区域...(USER area),USER区域中读取一个字节,偏移量为addr PTRACE_POKETEXT, 往内存地址中写入一个字节。...内存地址由addr给出 PTRACE_POKEUSER, 往USER区域中写入一个字节,偏移量为addr PTRACE_GETREGS, 读取寄存器 PTRACE_GETFPREGS, 读取浮点寄存器...PTRACE_PEEKDATA ptrace(PTRACE_PEEKTEXT, pid, addr, data) ptrace(PTRACE_PEEKDATA, pid, addr, data) 内存地址读取一个字节...PTRACE_PEEKUSR ptrace(PTRACE_PEEKUSR, pid, addr, data) USER区域中读取一个字节,pid表示被跟踪的子进程,USER区域地址由addr给出,

1.9K10
领券