前言:ptrace 是 Linux 内核提供的非常强大的系统调用,通过 ptrace 可以实现进程的单步调试和收集系统调用情况。...比如 strace 和 gdb 都是基于 ptrace 实现的,strace 可以显示进程调用了哪些系统调用,gdb 可以实现对进程的调试。本文介绍这些工具的底层 ptrace 是如何实现的。...这里选用了 1.2.13 的早期版本,原理是类似的,新版内核代码过多,没必要陷入过多细节中。 1 进程调试 ptrace 系统调用的实现中包含了很多功能,首先来看一下单步调试的实现。...通过 ptrace attach 到指定的 pid 完成对进程的调试(控制)。 首先看一下第一种的实现。...1.2 方式2 除了开始时通过 ptrace 设置进程调试,也可以通过 ptrace 动态设置调试进程的能力,具体是通过 PTRACE_ATTACH 命令实现的。
目前Linux内核主线不支持软实时,而是使用下面2个仓库存放和Linux内核主线的版本对应的实时内核的源代码。...(4)实现可抢占RCU,把RCU保护的读端临界区变成可以抢占的。 (5)把自旋锁和读写锁替换为可以抢占的、支持优先级继承的锁。 (6)互斥锁、伤害/等待互斥锁和读写信号量支持优先级继承。...在上面的例子中,把进程1的优先级临时提升到进程2的优先级,防止进程3抢占进程1,使进程1尽快执行完临界区,减少进程2的等待时间。 实时互斥锁(rt_mutex)实现了优先级继承。...为了降低实现的复杂性,只允许一个进程获取读锁,进程可以递归获取读锁。 读写锁的定义如下。...14.参考文档 (1)A realtime preemption overview,https://lwn.net/Articles/146861/,(说明:Linux内核没有完全按照这篇文档实现) (
本博客参考了李煜东的《算法竞赛进阶指南》,大家要是觉得这篇文章写的不错请大家支持正版。豆瓣图书 我在之前的博客中讲解了搜索序时间戳,这次我们讲讲追溯值的概念。...namespace std; const int N=100010; int head[N],ver[N*2],Next[N*2]; int dfn[N],low[N],n,m,tot,num; bool brige...low[x]=min(low[x],low[y]); if(low[y]>dfn[x]) { brige...[i]=brige[i^1]=1; } } else if(i!...dfn[i]) tarjan(i,0); int ans=0; for(int i=2;i<tot;i+=2) { if(brige[i]) {
CentOS7上搭建lamp环境 要求如下,搭建在同一台虚拟机上,实现下述3个功能: vhost1: pma.stu13.com, phpMyAdmin, 同时提供https服务 vhost2: wp.stu13...cd /web/dz tar xf /home/tools/Discuz_X3.2_SC_UTF8.tar # linux 不支持rar格式软件,这里用tar格式的替代 mv Discuz_X3.2..._SC_UTF8/upload/* ./ rm -rf Discuz_X3.2_SC_UTF8/# 清理无用的目录和文件 chown -R apache:apache /web/* # 防止解压出的文件的权限问题... # 重启httpd服务,使得SSL配置生效 三、安装mysql(这里以Mariadb通用二进制格式包为例) # 安装mariadb通用二进制格式包 tar xf mariadb-5.5.43-linux-x86..._64.tar.gz -C /usr/local/ cd /usr/local/ ln -s mariadb-5.5.43-linux-x86_64/ mysql cd mysql/ groupadd
通过OptionParser 模块自定义的命令,python 版本的wc 命令也可以达到linux 命令wc 的效果。 optparse用法详解: 1....options 是一个字典dict的形式,这个字典的key 都是以上自定义的命令的dest值。...例如,在这个例子里自定义了-c,-w,-l 三种命令选项,它们的action 都是"store_True",当输入有某一个命令时,它对应的存储变量的值就是True , 所以当以这种方式 python ...opt_wc.py -c 执行脚本的时候,就会获取到options 的值:['chars': True, 'words': Flase, 'lines': False].通过这个字典,就可以知道脚本要处理的命令是哪些了...就可以知道脚本需要处理的文件。
来源:Linux爱好者 ID:LinuxHub Linux文件管理从用户的层面介绍了Linux管理文件的方式。Linux有一个树状结构来组织文件。...它们的存储能力具有持久性,不会因为断电而消失;存储量大,但读取速度慢。 观察常见存储设备。最开始的区域是MBR,用于Linux开机启动(参考Linux开机启动)。...启动区之后的是超级区(Super block)。它存储有文件系统的相关信息,包括文件系统的类型,inode的数目,数据块的数目。 随后是多个inodes,它们是实现文件存储的关键。...在硬盘上实现这一分级结构的关键,是使用inode来虚拟普通文件和目录文件对象。 在Linux文件管理中,我们知道,一个文件除了自身的数据之外,还有一个附属信息,即文件的元数据(metadata)。...Linux以inode的方式,让数据形成文件。 了解Linux的文件系统,是深入了解操作系Linux原理的重要一步。
printf("You pressed '%c'!/n", getchar());
#include <stdint.h> namespace types { struct uint128_t { ...
,而在main.c函数的后面直接调用了printf函数,我们可以看下printf函数的参数是如何使用的。...和NR_BUFFERS*BLOCK_SIZE都为int类型; 以前已经分析过可变参数的一系列实现函数va函数。...我们先不管write函数的实现,首先来看vsprint。...str-buf;//返回值为字符串的长度 142 这样我们就实现了根据fmt中的格式转换符将可变参数转换到相应的格式,利用write函数进行输出的目的。...分析同上 而write函数跟fork函数一样是由_syscall*来实现的,内嵌汇编就不多解释了,直接展开就行 write.c _syscall3(int,write,int,fd,const char
Linux文件管理从用户的层面介绍了Linux管理文件的方式。Linux有一个树状结构来组织文件。树的顶端为根目录(/),节点为目录,而末端的叶子为包含数据的文件。...它们的存储能力具有持久性,不会因为断电而消失;存储量大,但读取速度慢。 观察常见存储设备。最开始的区域是MBR,用于Linux开机启动(参考Linux开机启动)。...启动区之后的是超级区(Super block)。它存储有文件系统的相关信息,包括文件系统的类型,inode的数目,数据块的数目。 随后是多个inodes,它们是实现文件存储的关键。...在硬盘上实现这一分级结构的关键,是使用inode来虚拟普通文件和目录文件对象。 在Linux文件管理中,我们知道,一个文件除了自身的数据之外,还有一个附属信息,即文件的元数据(metadata)。...Linux以inode的方式,让数据形成文件。 了解Linux的文件系统,是深入了解操作系Linux原理的重要一步。
守护进程是一种非常实用的进程。Linux的大多数server就是用守护进程实现的。比方,Internetserverinetd,Webserverhttpd等。同一时候,守护进程完毕很多系统任务。...守护进程的编程本身并不复杂,复杂的是各种版本号的Unix的实现机制不尽同样,造成不同Unix环境下守护进程的编程规则并不一致。...这须要读者注意,照搬某些书上的规则(特别是BSD4.3和低版本号的System V)到Linux会出现错误的。以下将全面介绍Linux下守护进程的编程要点并给出具体实例。 一....守护进程的编程要点 前面讲过,不同Unix环境下守护进程的编程规则并不一致。所幸的是守护进程的编程原则事实上都一样,差别在于具体的实现细节不同。这个原则就是要满足守护进程的特性。...同一时候,Linux是基于Syetem V的SVR4并遵循Posix标准,实现起来与BSD4相比更方便。编程要点例如以下; 1. 在后台执行。 为避免挂起控制终端将Daemon放入后台执行。
ECMP在不同版本的Linux内核实现方式不一样,总体上可分为4个阶段。 内核版本ECMP功能< Pre kernel v2.2无ECMP。...选ECMP实现变更的大版本的最新版本进行分析,涉及版本:3.5.7、3.6.11、4.4.163。...下面结合代码来分析上述两种情况下的ECMP实现。...那3.6到4.4之间的版本就不能实现Per-packet类型的ECMP吗?也不是不可能,使用iptables对“同一类IP报文”打上mark,配合ip-route的标签功能也能实现。.... */ res->nh_sel = 0; } ``` ECMP在Linux内核的实现的关键变更历史。
操作步骤 (1)创建锁 // 创建互斥锁mutex pthread_mutex_t mutex; (2)初始化锁 在Linux下, 线程的互斥量数据类型是pthread_mutex_t...,这个线程就会阻塞住,直到之前的线程unlock之后才能执行,由此,实现同步,也就达到保护临界区资源的目的。 ...为了实现互斥操作,大多数体系结构提供了swap或exchange指令,该指令的作用是把寄存器和内存单元的数据交换,由于只有一条指令,保证了原子性。...但互斥无法限制访问者对资源的访问顺序,即访问是无序的。 同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。...也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量是,也可以完成一个资源的互斥访问。
背景介绍 最近在完成一个由linux shell脚本编写的工具时,发现在实现多个功能时,冗长的多个参数不仅难记而且大小写混杂,虽然“悉心”地写了完备的'-h'帮助文档,但是为了实现其中一个功能,仍然需要输入多个冗长的字符串来定位某个大选项下的小选项所对应的功能...实现思路 在 linux shell 下本身有着体验极佳的命令补全功能,即[Tab][Tab]。现通过自定义该程序的命令补全脚本实现命令补全。...重点说明 执行shell 函数,函数中生成COMPREPLY作为候选的补全结果 compgen(筛选命令) 用来筛选生成匹配单词的候选补全结果 [root@localhost ~]# help compgen...COMP_CWORD 类型为整数,当前输入的单词在COMP_WORDS中的索引 COMPREPLY 类型为数组,候选的补全结果 COMP_WORDBREAKS 类型为字符串,表示单词之间的分隔符 COMP_LINE...类型为字符串,表示当前的命令行输入字符 COMP_POINT 类型为整数,表示光标在当前命令行的哪个位置 实例 注:本示例只针对实际应用场景做了简单实现,做个思路引子。
前言:之前的文章介绍了基于 tracepoint 静态追踪技术的实现,本文再介绍基于 kprobe 的动态追踪即使的实现。同样,动态追踪也是排查问题的利器。...#include #include #include #define MAX_SYMBOL_LEN...kretprobe 是基于 kprobe 实现的,主要逻辑是通过通过 kprobe 注册一个 pre_handler,在 pre_handler 中 hack 掉函数的栈,因为函数执行时,返回地址是存在栈中的...总结:内核通过劫持的方式实现了 kprobe,基于 kprobe 的动态追踪技术可谓是非常复杂而强大,我们可以利用这个机制,动态修改逻辑,收集信息。...不过实现过于复杂,涉及到对 CPU 架构和内存模型的了解,本文也是大致分析了一下流程,有兴趣的同学可以自行查看源码。
磁盘与目录的容量 磁盘的整体数据是在superblock块中,但是每个个别文件的容量则在inode当中记载,常用来显示磁盘使用量的两个命令 df: 列出文件系统的整体磁盘使用量 du: 评估文件系统的磁盘使用量...) -i: 不用硬盘容量,而以inode的数量显示 df主要读取的数据几乎都是针对整个文件系统,因此读取的范围只要是在super block内的信息,所以这个命令显示结果的速度非常快速。...不包括子目录下的总计 -k 以KB列出容量显示 -m 以MB列出容量显示 du会直接查找文件系统的所有文件数据 连接文件: ln 在linux下的连接文件有两种:一种是类似Windows上的快捷方式,...号码,连接文件的重要内容就是它会写上目标文件的文件名,因为箭头右边的文件是 4 Byte,所以连接文件的大小为 4 byte。...若想要仔细一点,则可对刚才新建好的文件系统进行检验。 在linux系统上,需要创建挂载点(也即是目录),并将它挂载上来。
告别过去 在vscode有了remote ssh之前,大多数Linux服务器开发者通常使用vs远程Linux,或者xshell配合vim的姿势,进行服务器开发,虽然vs很强大,调试很清晰,可是打开vs的时间和启动调试的时间是比较长的...,xshell使用vim虽然也很方便,但是仍然会存在感官上的不足,我厌倦了打开多个tab来回切换,也厌倦了千篇一律的命令行界面, 所以我选择了vscode远程Linux服务器来学习linux开发。...快捷开发,一秒启动vscode 上部分页面编辑,下部分使用命令行,再也不用来回切换tab 通过ssh连接Linux服务器,实现Linux环境的调试运行 怎样获得 1....连接Linux服务器 ? 5. 进行开发,安装开发所需扩展(以c++为例) ? 6.
FIFO通信(first in first out) FIFO 有名管道,实现无血缘关系进程通信。...创建一个管道的伪文件 a.mkfifo testfifo 命令创建 b.也可以使用函数int mkfifo(const char *pathname, mode_t mode); 内核会针对fifo文件开辟一个缓冲区...,操作fifo文件,可以操作缓冲区,实现进程间通信–实际上就是文件读写 man 3 mkfifo #include #include int mkfifo...buf) = %d\n", strlen(buf)); printf("read is%s\n", buf); } close(o_ret); return 0; } 以上就是本文的全部内容...,希望对大家的学习有所帮助。
使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄、收藏。可是为什么要这么写却不知其然。本文用一个最短的例子说明脚本的原理。 脚本代码如下: #!.../usr/bin/expect] 这一行告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。...注意:这一行需要在脚本的第一行。 2. [set timeout 30] 基本上认识英文的都知道这是设置超时时间的,现在你只要记住他的计时单位是:秒 3....[expect “password:”] 这里的expect也是expect的一个内部命令,有点晕吧,expect的shell命令和内部命令是一样的,但不是一个功能,习惯就好了。...以上就是本次介绍的关于Linux实现自动登录的相关实例内容,感谢大家的学习和对ZaLou.Cn的支持。
而这些方向往往都涉及到底层的东西,所以就自然需要去了解内核提供的一些技术,内核提供的能力,经过多年的发展,可谓是百花齐放,而且非常复杂。本文简单分享一下内核的静态追踪技术的实现。...追踪,其实就是收集代码在执行时的一些信息,以便协助排查问题。 1 Tracepoint Tracepoints 是一种静态插桩的技术,实现虽然复杂,但是概念上比较简单。...2 trace event 有了 Tracepoint 机制后,我们就可以写模块加载到内核中实现自己的插桩点。但是内核也为我们内置提供了非常多的插桩点。具体是通过 trace event 来实现的。...我们可以看到插桩的这种机制是一种静态的机制,我们通常需要依赖当前版本的内核所支持的桩,从而获得对应的信息,但其实内核也提供了动态追踪的能力,可以实现热插拔获取信息的能力。...总的来说,Linux 下的追踪技术多种多样,虽然非常复杂,但是上层也提供了各种更方便的工具,这些能力是我们深入排查问题的利器。
领取专属 10元无门槛券
手把手带您无忧上云