P1 和 P2 从后向前遍历,当 P1 遍历到一个空格时,就需要令 P2 指向的位置依次填充 02%(注意是逆序的),否则就填充上 P1 指向字符的值。...从后向前遍是为了在改变 P2 所指向的内容时,不会影响到 P1 遍历原来字符串的内容。 ③ 当 P2 遇到 P1 时(P2 <= P1),或者遍历结束(P1 < 0),退出。...if (str.charAt(i) == ' ') { str.append(" "); } } //追加完后,...P2指向现在的末尾 int P2 = str.length() - 1; //从后往前遍历,如果发下空格就填充%20,否则把P1指向的内容往后挪 while
你的程序还需要返回被替换后的字符串的长度。 注意事项 如果使用 Java 或 Python, 程序中请用字符数组表示字符串。...先扩充,从后往前处理 这个说是字符串,实际上是字符数组,并没有用c++STL的string来做,要是那样就太简单了,因为string本身支持+操作,只要遍历遇到空格用%20代替加上就可以了,如果是字符数组的话就难一些...所以一个可行的思路是把原数组扩大,扩大的容量可以通过检查空格的个数来定,然后用两个指针,从后往前把字符放进去,遇到空格则连续放入%20,因为是从后往前,所以不会出现数据没有地方放的情况。...=32) //如果不是空格,就把这个值放进去,从后往前 { string[i+2*blank_count]=string
Github上了一个名叫SharpNukeEventLog的项目,目的是在执行敏感操作时不会产生windows日志记录。...我们平时在进行windows的操作时都会产生对应的windows日志记录,以添加用户为例, ? 我们会在安全目录下产生6条事件记录,作为蓝队可以着重关注4720、4722、4724这三条日志记录。...即使使用一些方法清除日志,也会留下id为1102的清除日志的记录。 ?...而该工具则可以免除该问题,在windows中日志记录是依靠服务来进行生效的,其服务名称为:Windows Event Log ?...那我们的2224进程就是负责日志记录的进程,使用process hacker可以清除的看到其服务名及address(wevtsvc.dll) ?
Python 截取字符串使用 变量[头下标:尾下标],就可以截取相应的字符串,其中下标是从0开始算起,可以是正数或负数,下标可以为空表示取到头或尾。...0000' + str(num) # 合并字符串 print str[-5:] # 输出字符串右5位 >> 00018 Python 替换字符串使用 变量.replace(“被替换的内容”,“替换后的内容...要注意的是使用replace替换字符串后仅为临时变量,需重新赋值才能保存。...查找到后会返回位置,位置从0开始算,如果每找到则返回-1。
简单的epoll例子 下面的例子,是从笔者本人用c语言写的dbproxy中的一段代码。由于细节过多,所以做了一些删减。...那么,由accept获得的client_fd的结构如下图所示: (注:由于是tcp socket,所以这边sock->ops=inet_stream_ops,这个初始化的过程在我的另一篇博客从linux...源码看socket的阻塞和非阻塞>>中,博客地址如下: https://my.oschina.net/alchemystar/blog/1791017) 既然知道了tfile->f_op->poll的实现...(soft_irq),再通过linux的软中断机制调用net_rx_action,如下图所示: 注:上图来自PLKA(Linux内核架构>>) step2: 紧接着跟踪next_rx_action...总结 epoll作为linux下非常优秀的事件触发机制得到了广泛的运用。其源码还是比较复杂的,本文只是阐述了epoll读写事件的触发机制,探究linux kernel源码的过程非常快乐_。
从linux源码看epoll 前言 在linux的高性能网络编程中,绕不开的就是epoll。...简单的epoll例子 下面的例子,是从笔者本人用c语言写的dbproxy中的一段代码。由于细节过多,所以做了一些删减。...(注:由于是tcp socket,所以这边sock->ops=inet_stream_ops,这个初始化的过程在我的另一篇博客从linux源码看socket的阻塞和非阻塞>>中,博客地址如下: https...(soft_irq),再通过linux的软中断机制调用net_rx_action,如下图所示: ?...总结 epoll作为linux下非常优秀的事件触发机制得到了广泛的运用。其源码还是比较复杂的,本文只是阐述了epoll读写事件的触发机制,探究linux kernel源码的过程非常快乐^_^。
今天看数据库内核月报,发现一个蛮有意思的问题,就是show binary logs的时候没有任何结果,这个问题的原因很简单,但是分析问题的过程相比是艰辛的,需要在各种潜在的可能中找到那个肯定的结果...直接删掉那个空行,然后再次刷新日志即可。 先删掉空格,然后刷新日志,如下所示。
从linux源码看socket的close 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情。...上篇博客讲了socket的阻塞和非阻塞,这篇就开始谈一谈socket的close(以tcp为例且基于linux-2.6.24内核版本) TCP关闭状态转移图: 众所周知,TCP的close过程是四次挥手...但最终解决方案还是得从应用程序着手。...总结 linux内核源代码博大精深,阅读其代码很费周折。之前读>的时候由于有先辈引导和梳理,所以看书中所使用的BSD源码并不觉得十分费劲。...直到现在自己带着问题独立看linux源码的时候,尽管有之前的基础,仍旧被其中的各种细节所迷惑。希望笔者这篇文章能帮助到阅读linux网络协议栈代码的人。
tail -f 实时查看日志文件 tail -f 日志文件log tail – 100f 实时查看日志文件 后一百行 tail -f -n 100 catalina.out linux查看日志后100
本文大部分讨论的是socket设置为block的情况,即setNonblock(false),仅在最后提及了nonblock socket(本文基于linux 2.6.32-431内核)。...kernel代码版本细微变化 值得注意的是,linux本身官方发布的2.6.32源码对于tcp_syn_retries2的解释和RFC并不一致(至少笔者阅读的代码如此,这个细微的变化困扰了笔者好久,笔者下载了和机器对应的内核版本后才发现代码改了...到期后timeout,其重传到期时间通过tcp_retries2以及TCP_RTO_MIN计算出来。...java的SocketInputStream的sockRead0超时时间 java的超时时间由SO_TIMOUT决定,而linux的socket并没有这个选项。...对端物理机宕机后没有数据发送,但在read等待 这时候如果设置了超时时间timeout,则在timeout后返回。
关于epoll的原理可以看下笔者之前的博客《从linux源码看epoll》: https://www.cnblogs.com/alchemystar/p/13161781.html 在这里描述一下原因,...Socket上(Sharding),毫无疑问可以利用多核能力,大幅提升连接成功后的Socket分发能力。...在accept_queue被填充后,由用户线程通过accept系统调用从队列中获取对应的fd 值得注意的是,当用户线程来不及处理的时候,内核会drop掉三次握手成功的连接,导致一些诡异的现象,具体可以看笔者的另一篇博客...: https://www.cnblogs.com/alchemystar/p/13473999.html 另外,对于accept_queue具体的填充机制以及源码,可以见笔者另一篇博客的详细分析 《从Linux...源码看Socket(TCP)的listen及连接队列》: https://www.cnblogs.com/alchemystar/p/13845081.html 总结 Linux内核源码博大精深,每次扎进去探索时候都会废寝忘食
---- 背景 之前做 MySQL 参数优化的时候,为了寻找瓶颈,我通常是观察 MySQL 的 status ,看哪些计数器有问题,以便确认问题的大致范围和应该调整的参数。...看总量 mpstat 1 20 Linux 5.14.0-55.el9.x86_64 (git-sqlpy-com) 07/21/2022 _x86_64_ (2 CPU) 01:16:46...---- 针对性优化 由于我们已经知道是写 redo-log 和 binlog 日志慢了,所以我们可以针对性的做参数优化了。...---- 优化后的各项指标 我们还是先看一下参数调整后 IO 的消耗怎么样,命令和输出如下。...,从 1.6k 提升到了 1.7k ,但是这次写的实在是太多了,下次再写吧。
从linux源码看socket(tcp)的timeout 前言 网络编程中超时时间是一个重要但又容易被忽略的问题,对其的设置需要仔细斟酌。...kernel代码版本细微变化 值得注意的是,linux本身官方发布的2.6.32源码对于tcp_syn_retries2的解释和RFC并不一致(至少笔者阅读的代码如此,这个细微的变化困扰了笔者好久,笔者下载了和机器对应的内核版本后才发现代码改了...在timeout>0时,将socket设置为非阻塞,然后用select系统调用去模拟超时,而没有走linux本身的超时逻辑,如下图所示: ?...到期后timeout,其重传到期时间通过tcp_retries2以及TCP_RTO_MIN计算出来。...对端物理机宕机后没有数据发送,但在read等待 这时候如果设置了超时时间timeout,则在timeout后返回。
前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情。...今天笔者就来从Linux源码的角度看下Server端的Socket在进行bind的时候到底做了哪些事情(基于Linux 3.10内核)。...这个分支表明之前bind的port和当前sock都设置了reuse同时当前sock状态不为listen // 或者同时设置了reuseport而且是同一个uid(注意,设置了reuseport后,...SO_REUSEPORT SO_REUSEPORT是Linux在3.9版本引入的新功能。...如下图所示: 而开启了SO_REUSEPORT后,代码栈如下: tcp_v4_rcv |->__inet_lookup_skb |->__inet_lookup |->__inet_lookup_listener
PostgreSQL 查看内存使用的方法比较多, 大部分都是进入到POSTGRESQL 中进行查看的,今天从PostgreSQL 外部来查看内存的使用方式和方法....在LINUX 中proc目录中有所有相关的进程的信息, PSS 通过下面的预计获得,所以RSS - PSS 等于的就是进程独享的内存 ps -u postgres o pid= | sed 's#.
前言:昨天有个同学碰到发送udp包时收到destination unreachable的icmp包问题,本文简单介绍一下linux5.9中icmp包的处理流程。...我们从收到一个udp包开始分析,具体函数是udp_rcv。...收到icmp包的处理流程 我们从收到ip包开始分析。...icmp_socket_deliver(skb, info);} 继续看icmp_socket_deliver static void icmp_socket_deliver(struct sk_buff...sk->sk_error_report = sock_def_error_report; 接着看sock_def_error_report static void sock_def_error_report
再也不怕过时了,当然,现在内核的代码量级非常大,不可能看得完也不可能都看,只是选取自己感兴趣的一些点看一下。...看内核代码,总的来说是非常有趣的,不仅是因为知其然知其所以然,而且看到朴素的c语言,还有世界级大佬写代码的思路、思想,甚至注释,都是非常有意思的事情。...今天分析的内容是从socket函数开始,看看linux网络层的设计。下面我们看一下我们平时写网络编程代码时的用法。...网络层的初始化 从socket函数的定义中我们看到有family和type两个参数,这两个属性都会对应不同的实现。我们先看看family的实现。...很多同学应该都知道Linux万物皆文件的哲学思想,当我们调用socket拿到一个结构体后,并不是把这个结构体返回给调用方,而是返回一个文件描述符fd。
【实施工程师】Linux查看日志后100行 tail -f 实时查看日志文件 tail -f 日志文件log tail - 100f 实时查看日志文件 后一百行 tail -f -n 100 catalina.out...linux查看日志后100行 希望能对大家有所帮助。...【查看内存】Linux查看内存使用情况(一) 用 'top -i' 看看有多少进程处于 Running 状态,可能系统存在内存或 I/O 瓶颈,用 free 看看系统内存使用情况,swap 是否被占用很多
笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情。 大部分高性能网络框架采用的是非阻塞模式。...笔者这次就从linux源码的角度来阐述socket阻塞(block)和非阻塞(non_block)的区别。 本文源码均来自采用Linux-2.6.24内核版本。...由于网络协议非常复杂,内核里面用到了大量的面向对象的技巧,所以我们从创建连接开始,一步一步追述到最后代码的调用点。...如下图所示: 阻塞后什么时候恢复运行呢 情况1:有对应的网络数据到来 首先我们看下网络分组到来的内核路径,网卡发起中断后调用netif_rx将事件挂入CPU的等待队列,并唤起软中断(soft_irq...希望笔者这篇文章能帮助到阅读linux网络协议栈代码的人。
前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情。...今天笔者就来从Linux源码的角度看下Client端的Socket在进行Connect的时候到底做了哪些事情。由于篇幅原因,关于Server端的Accept源码讲解留给下一篇博客。...我们先看一下搜索端口号的逻辑,如下图所示: 获取端口号范围 首先,我们从内核中获取connect能够使用的端口号范围,在这里采用了Linux中的顺序锁(seqlock) void inet_get_local_port_range...这也保证了上面的读取变量都是一致的,也即low和high不会出现low是改前值而high是改后值得情况。low和high要么都是改之前的,要么都是改之后的!...-ENETUNREACH,对应描述为Network is unreachable Client端的三次握手 在前面一大堆前置条件就绪后,才进入到真正的三次握手阶段。
领取专属 10元无门槛券
手把手带您无忧上云