
Linux
文章平均质量分 82
imred
天下事有难易乎?为之,则难者亦易矣;不为,则易者亦难矣。人之为学有难易乎?学之,则难者亦易矣;不学,则易者亦难矣。
展开
-
Linux:bash在被调用时会读取哪些启动文件?
bash在被调用时会读取哪些启动文件?要回答这个问题,首先要弄清楚两个概念:login shell和interactive shell。原创 2024-07-28 21:40:32 · 494 阅读 · 0 评论 -
Qt:愚蠢的qmake
博主参与了一个使用qmake构建的项目,包含几百个源文件,最近遇到一个恼人的问题:有时仅仅修改了一个.cpp文件,构建项目时就有可能触发全编译。但是编译时又会命中ccache的缓存,这说明源代码实际上内容并没有发生变化。原创 2024-07-21 23:25:54 · 936 阅读 · 1 评论 -
Linux:使用vim编辑文件为什么会影响目录的mtime
touch一个存在的文件,文件的mtime发生了更新,文件所在目录的mtime不会更新;而使用vim编辑这个文件后再保存,文件和文件所在目录的mtime都会被更新。为什么会这样呢?本文将解释一下这种现象的成因。原创 2024-07-18 23:35:28 · 663 阅读 · 0 评论 -
Linux:在使用UEFI固件的计算机上内核是如何被启动的
启动计算机通常不是一件难事:按下电源键,稍等片刻,你就能看到一个登录界面,再输入正确的密码,就可以开启一天的网上冲浪之旅了。但偶尔这件事没那么顺利,有时候迎接你的不是熟悉的登录界面,而是一个令人生畏的命令提示符界面,一闪一闪的提示符告诉你:“你碰到麻烦了”。于是你对着错误提示查找解决方法,按照网页上的步骤,你对着提示符输入并执行了几条你完全不理解的命令,计算机又能正常启动了,但同时你发现你那存有大学舍友糗照的硬盘分区被清空了。原创 2023-08-05 16:12:08 · 2416 阅读 · 0 评论 -
bash:如何直接diff两条命令的输出
如果我们想要diff两条命令的输出,一种容易想到的做法是将两条命令的输出分别重定向到两个文件中,然后diff两个文件的内容:$ readelf -WS ./a.out > a.txt$ readelf -WS ./a.out.full > b.txt$ diff a.txt b.txt而bash的Process Substitution机制可以帮助我们简化类似上面这类工作,把三条命令合并成一条:$ diff <(readelf -WS ./a.out) <(reade原创 2022-05-12 21:56:41 · 957 阅读 · 0 评论 -
蹭个热点:用bash统计csdn博客阅读量是否符合本福特定律
拜大洋彼岸国家大选所赐,本福特定律这两天在微博和知乎上突然火了起来,因为有人根据本福特定律推断大选投票结果有人为操纵的痕迹。那么什么是本福特定律呢?本福特定律的内容大致是这样的:对于一组样本足够大,且难以人为操控的自然十进制数据,如世界上所有国家的人口、面积、GDP等,其首位为n的数据占数据总量的比例为:P(n)=log10(n+1n)P(n)=\log_{10}\left(\frac{n+1}{n}\right)P(n)=log10(nn+1)计算下来,以1打头的数据占数据总量的30.10%原创 2020-11-09 22:07:23 · 402 阅读 · 2 评论 -
localhost还是127.0.0.1,这是一个问题(并不是)
(本文内容仅针对Linux环境,内核版本4.15,thrift版本0.11.0,glibc版本2.27)localhost比127.0.0.1快?有江湖传言称,“使用localhost访问本机服务比使用127.0.0.1要快”,这有没有道理呢?自然是没有道理的,除了个别的特例(如https://www.php.net/mysql_connect)因为会对localhost做特殊处理(使用UNIX domain socket替代TCP socket)所以可能快一点(存疑,未验证)外,其他情况使用loca原创 2020-07-29 22:59:27 · 2013 阅读 · 0 评论 -
Linux:利用内核日志记录系统启动时产生的进程树
前言之前项目中遇到过一个bug,bug产生的原因是某个程序在两个不同的启动脚本中被同时启动了两次,系统中出现了两个实例。这个程序在代码内部没有保证单实例,靠shell脚本的pidof(1)命令保证单实例,然而因为两个启动脚本的启动时间太过接近,pidof(1)没能起作用,导致程序被启动了两次。出了这个bug后就想着需要梳理一下系统在启动时都运行了哪些脚本,这个系统“传承”了估计有七八年,启动脚...原创 2020-04-12 16:07:39 · 910 阅读 · 0 评论 -
使用bash和graphviz分析并可视化C/C++源文件依赖关系
流程流程并不复杂:使用find命令搜索指定目录所有C/C++源文件扫描所有源文件,使用cpp(The C Preprocessor)过滤掉注释后,使用sed提取#include,生成依赖条目将所有依赖条目拼成.dot文件,然后使用graphviz中的dot工具将.dot文件转为.png图片代码代码的Github仓库为dep,为了方便~~(以及凑字数)~~放在这里一份:#!/bin...原创 2020-03-29 17:34:28 · 1759 阅读 · 0 评论 -
bash的几种特别的I/O重定向语法
下面这几种重定向语法都很简单,容易记住:ls > stdout.tx # 用标准输出覆盖stdout.txtls not-exist-file 2> stderr.txt # 用标准错误覆盖stderr.txtls exist-file not-exist-file > stdout.txt 2> stderr.txt # 用标准输出覆...原创 2020-02-22 14:41:23 · 416 阅读 · 0 评论 -
Linux C/C++调试之五:程序运行耗时的组成
分析程序出现的启动缓慢、响应缓慢和操作卡顿等性能问题时,第一步不该是打开代码编辑器浏览我们的代码,而是首先确定问题是否发生在我们的代码中,简单点的方法就是打开top做一个大致的判断,看一看各CPU的us、sy、id耗时的占比都是多少。进一步来讲,我们需要确定时间都花到什么地方了,是我们的代码中?内核中?还是进程睡大觉的地方?现在假设我们的程序运行在一个CPU资源丰富的环境中,因此就不考虑进程争夺C...原创 2020-01-11 23:00:24 · 1768 阅读 · 0 评论 -
以非 root 用户身份使用 Wireshark 抓包(Sniffing with Wireshark as a Non-Root User)
原文地址:http://packetlife.net/blog/2010/mar/19/sniffing-wireshark-non-root-user/ 这篇文章是针对Linux和某些UNIX系统而写的,Windows用户可以参阅这里。 许多网络工程师第一次在Linux机器翻译 2015-12-10 17:25:18 · 3576 阅读 · 0 评论 -
在Linux下实现一个使用键盘控制的虚拟鼠标
在Linux下创建一个虚拟鼠标设备还是比较简单的,使用内核uinput模块提供的函数即可。创建出虚拟鼠标以后,在主线程监听键盘的事件,当特定的键(此处使用了小键盘的数字键8、2、4、6)被按下或弹起后,进行记录。在另一个线程根据主线程记录的flag创建输入事件,然后将输入事件写入虚拟鼠标设备即可。在实现程序时一个让我思考时间比较长的问题是:是否需要另外创建一个线程来写虚拟鼠标设备。当一个键被按下...原创 2018-11-11 21:48:24 · 3920 阅读 · 1 评论 -
linux下鼠标事件丢失与evdev缓冲区溢出问题
之前遇到这样一个bug:在一个性能较差的linux平台上的一个Qt程序,当UI线程在执行耗时操作时,界面会卡顿,而这时频繁点击滑动鼠标,会出现鼠标事件丢失的问题。举个例子:某个控件收到一个鼠标按下的事件,但再也没有收到鼠标弹起事件,而此时鼠标按键实际上已经弹起了,这就导致程序进入了一种异常状态,除非再次点击鼠标,否则无法恢复。上面这个问题是在QApplication的事件过滤器中确定的,全局的QA...原创 2018-12-15 17:33:18 · 1144 阅读 · 2 评论 -
Linux C/C++调试之二:使用strace追踪程序系统调用
在之前的一篇文章中,我介绍了一种调试手段:利用LD_PRELOAD机制,拦截动态链接器对动态库的符号解析,达到监控程序IO的目的。事实证明我还是太naive了,我们大可利用现成的工具——strace,来更好地完成这一项工作。strace不只能跟踪程序IO,它能跟踪程序的所有系统调用,实现的基本手段是ptrace系统调用,不过实现细节还没研究过,今天只总结一下它的用法。首先用strace来跟踪一...原创 2019-03-02 18:27:42 · 3217 阅读 · 0 评论 -
Qt在Linux下如何查找可用字体
最近遇到一个问题:一个Qt程序在Windows上正常运行,在Linux下编译运行后汉字就全变成方块了,成了名副其实的“方块字”。我一开始考虑是字符编码问题,调用QChar::unicode检查中文字符的编码,发现没有问题。如果不是编码问题,那就需要考虑是字体问题了。然后就安装了文泉驿字体,然后将控件字体设置为文泉驿,发现还是没有用。调用QFontDatabase::families检查所有可...原创 2019-04-09 20:58:13 · 4331 阅读 · 0 评论 -
ptrace系统调用的实现
最近遇到这样一个问题,机器跑着跑着画面冻结了,打开top看到Xorg的cpu占用率100%。想用gdb挂上去看一下,结果gdb一直卡着挂不上去。后来又换用perf分析,结果发现进程99%的时间花在了一个ioctl调用。这个ioctl操作的是nvidia显卡,进程实际上是卡在了nvidia的驱动中。我对gdb挂不上去这件事感到很好奇,之前除了因为进程已经被另一个gdb调试而导致gdb挂不上去之外,...原创 2019-05-12 15:32:28 · 2883 阅读 · 0 评论 -
linux下监控shell脚本或可执行程序启动过的子进程
使用history命令可以查看在shell中直接执行过的命令,但是无法查看间接执行过的命令,或者说启动过的子进程。举个例子,shell脚本或者make命令都会启动一些子进程,这些子进程并不会显示在history命令的输出中,那么如何监控他们启动过哪些子进程呢?首先需要明确的是,shell脚本靠得也是sh可执行程序加载执行,./foo.sh的效果一般等同于sh ./foo.sh,因此监控shell...原创 2019-07-21 11:34:42 · 1461 阅读 · 0 评论 -
gettimeofday和clock_gettime是不是系统调用?
在《Linux多线程服务端编程》一书5.1节中提到过,在x86-64的Linux上,gettimeofday不是系统调用,不会陷入内核。其实这种说法有点小问题,因为gettimeofday确实是个系统调用,但是linux的vdso(virtual dynamic shared object)机制帮我们做到了在调用这些系统调用时不陷入内核,从而提高了性能。vdso机制说白了就是在用户空间帮我们实现...原创 2019-08-25 16:13:07 · 6370 阅读 · 1 评论 -
Linux C/C++调试之三:性能分析工具callgrind的使用
callgrind是valgrind工具套件中用于分析程序性能的一个工具,它能够得到粒度为函数、代码行和指令级别的性能数据,具体来说,我们可以得到某个函数、某行代码、某条指令处累计执行了多少条指令。我们看一个实例:// foo.cppint accumulate(int begin, int end){ int result = 0; for (int i = begin;...原创 2019-09-01 21:13:55 · 4079 阅读 · 0 评论 -
Linux C/C++调试之四:callgrind的局限
在上篇文章中我介绍了callgrind的大致用法,可以看出来,callgrind是一个非侵入式的,使用起来也很傻瓜的调优工具。初用时感觉这个工具非常趁手,是个程序都想用callgrind去分析一下。但深入使用后发现,callgrind不是银弹,它还是有一些缺陷的。这些缺陷的根源在于:callgrind使用指令数来衡量性能,而程序员用耗时来衡量性能,指令数与耗时仅仅是一个正相关的关系,而非成比例的关...原创 2019-09-01 23:49:51 · 2010 阅读 · 1 评论 -
Linux下对input设备调用ioctl时指定EVIOCGBIT选项时的缓冲区该多大
我们有时候需要获取/dev/input目录下的eventX设备支持哪些事件(EV_KEY、EV_REL和EV_ABS等),可以通过ioctl调用指定EVIOCGBIT(ev, len)选项来获取,例如:ioctl(fd, EVIOCGBIT(0, EV_MAX), buf);来获取fd设备支持的事件。这涉及到一个问题:buf需要指定多大的长度? EVIOCGBIT宏的第二个参数是事件标志...原创 2018-09-12 22:57:26 · 3933 阅读 · 2 评论 -
gdb的watchpoint在系统调用中被修改似乎不会被触发
今天遇到一个越界写问题,覆盖了栈底的金丝雀值,导致运行时报“*** stack smashing detected ***”。一开始尝试用gdb的watchpoint定位,但就是眼睁睁的看着运行结束后金丝雀值被修改而没有触发watchpoint,最后无奈一行行的定位,发现是一个ioctl导致的越界写。 后来我试着研究watchpoint未被触发的原因,在GDB的官方Wiki发现这么一句话:...原创 2018-09-09 22:54:39 · 1259 阅读 · 0 评论 -
Linux:openSUSE DNS 配置错误导致无法上网
舍友使用的是 Linux openSUSE 操作系统,最近两天无法上网,无论是无线网络还是有线网络均无法上网。具体表现为 ping 网关可以 ping 通,但是 ping 百度,或者在浏览器中打开百度都成功不了。 第一感觉是DNS的问题,于是检查系统的DNS服务器列表:$ nslookup>server 无论是使用无线网络(10网段),还是有线网络(192.168网段),上面命令的输出均为原创 2015-04-09 20:42:09 · 3178 阅读 · 0 评论 -
Linux:getrusage的用法
名称getrusage - get resource usage,该函数可以程序统计对系统资源的使用量。(实际上是统计了进程执行直到调用该函数时的资源用量,如果在不同的时间调用该函数,会得到不同的结果)概要所需头文件:sys/time.h(为了得到timeval结构体的声明,这个结构体实际上在bits/time.h中声明),sys/resource.h原型int getrusage(int who,原创 2016-02-07 17:15:22 · 13076 阅读 · 0 评论 -
Linux:Fedora 23 Workstation 的 coredump 文件的位置
转载请注明来源:imred的专栏 | http://blog.youkuaiyun.com/imred/article/details/50404031 博主使用的Linux发行版是Fedora 23 Workstation桌面版,有时程序运行崩溃了提示core dumped,但是怎么也找不到core文件的位置,今天费了一些工夫,弄明白了这些文件到底存在了哪里。 今天在运行一个程序时,core dump掉了原创 2015-12-25 17:52:13 · 1764 阅读 · 0 评论 -
Linux:source 命令的一点小细节
前几天听到同学提起了Linux中的source命令,能用来执行一个shell脚本文件,即使这个脚本文件没有设置可执行权限位(x)。当时我就想,这样应该会方便不少,不用再输入一个chmod语句来给shell脚本加上可执行权限了。 今天我测试了一下source这个命令,功能正如前面同学所述的那样。到最后,我随手敲了一个“source /bin/yum”命令(Fedora23用dnf代替了yum,此时y原创 2015-12-22 20:24:11 · 2692 阅读 · 0 评论 -
GNU make 使用笔记 (一)
转载请注明来源:http://blog.youkuaiyun.com/imred/article/details/50115257 (这是linux下make工具info page的笔记,主要是一些对原文翻译的记录和理解)2.1 Rule长啥样简单的makefile包含着一组rules,即一组规则。这些规则有以下格式:目标 ... : 依赖的文件 ... 命令 ... ...目标原创 2015-11-30 16:55:06 · 1185 阅读 · 0 评论 -
linux wget命令常见用法( 断点续传 、 GET请求链接 )
1 断点续传直接使用wget命令是不开启断点续传功能的,需要添加 -c 参数,如wget -c example使用 -t 参数指定断点续传尝试次数,置0表示尝试无数次,如wget -c -t 100 example使用 -T 参数指定超时时间,超时后重连,如wget -c -t 100 -T example以上原创 2014-11-30 19:28:02 · 10435 阅读 · 0 评论 -
Linux 权限管理之一:文件夹的 rwx 权限
文件夹的权限管理理应不是个复杂的东西,但我总是弄混,今天整理出来加深一下自己印象。 文件夹也像普通文件那样有3种基本的权限:r(Read)、w(Write)、x(eXecutable),但却有一些微妙的区别。r(Read)和 x(eXecutable)某一用户拥有对文件夹的 r 权限以后,并不意味着该用户该用户可以进入该目录读取该目录的内容,r 权限让用户能够读取该目录的内容,但不能进入该目录,测原创 2015-05-30 00:50:36 · 2163 阅读 · 0 评论 -
Linux Shell 初学者对trap语句的思考
最近在学习Linux Shell(bash),学到trap命令时遇到了一些困惑原创 2014-09-17 17:32:57 · 840 阅读 · 0 评论 -
linux GB2312转UTF-8 shell脚本
#!/bin/bashIFSBACKUP=$IFS #备份IFS变量IFS=$(echo -en "\n\b") #设置IFS变量不含空格,防止文件名中有空格时出现异常dst=$(echo $1|sed 's/\/$//') #如果路径末尾有“/”,删除掉,后面再添加for file in $(ls "$dst"|grep .txt)do gb231原创 2014-11-09 17:03:35 · 6556 阅读 · 0 评论 -
Linux 权限管理之二:setuid、setgid 和 sticky bit
Linux 下的文件和文件夹除了拥有 rwx 这三种基本权限以外,还可能有三种特殊的权限:setuid(SUID)、setgid(SGID)和sticky bit(SBIT),其具体描述如下:setuid(SUID)首先要强调,SUID 仅对二进制程序文件有效。 当一个二进制程序设有 SUID 时,其权限显示如下(以 /bin/passwd 为例):[admin@localhost ~]$ ll原创 2015-05-30 22:11:02 · 1432 阅读 · 0 评论 -
安装bash on windows卡在“正在提取文件系统,这将需要几分钟的时间”的解决方法
bash on windows看起来很美好,但是安装的过程不是那么美好。 碰到的第一个问题是下载总是中断,网络稍有波动就终止下载,自动退出。又不能断点续传,只能重新下载,折腾了好几次才下载完毕。 下载完毕了以后就提示“正在提取文件系统,这将需要几分钟的时间”,然后就一直卡在了这个地方,等了半个多小时也没用(bash对中文支持不好,一会儿就变成了乱码)。 百度无解,只能谷歌,发现在BashOnW原创 2016-08-10 22:10:35 · 4571 阅读 · 0 评论 -
Qt的事件驱动机制与eventfd
简介Qt是一个事件驱动的GUI框架,那么,这个“事件驱动”说的是什么呢?以我的理解就是:对于UI线程,除了初始化代码和主循环本身之外,跑在CPU上的每条指令,要么是为了接收事件,要么就是某个事件触发的,这个事件可以直接来源于用户操作,也可以间接来源于用户操作(处理用户操作事件时触发了需要异步处理的其他事件),或者来源于socket,或者来源于定时器,等等。使用事件驱动能够避免对CPU时间的...原创 2018-09-02 20:45:36 · 3153 阅读 · 1 评论 -
Linux C/C++调试之一:利用LD_PRELOAD机制监控程序IO操作
引言有时,我们为了分析程序的某些问题(例如性能问题),需要对程序的IO操作的频率耗时等数据进行监控。就以经常调用的read和write函数为例,如何监控程序中所有上述两种操作,同时进行计时呢?使用gdb打断点自然是个方法,这样可以很容易发现程序中所有的调用,但是这样就没办法计时了。如果在程序中所有read/write函数前后打上时间戳,就可以实现计时了,但是这会有另一个问题,我们可能调用了某些...原创 2018-07-18 22:52:37 · 2792 阅读 · 0 评论 -
Linux可用内存充足时进程常驻内存被淘汰的问题
最近遇到这样一个问题:生产环境的某个C++ GUI程序界面时常出现卡顿问题,经过排查与进程的大量IO有关,但是奇怪的是,即使IO已经结束,操作界面时仍然会有卡顿问题。继续排查,发现进程常驻内存的代码段和数据段在大量IO之后变小了,排查过程如下: 为了复现整个过程,使用以下demo代替GUI程序,能得到类似的效果:#include &amp;lt;stdio.h&amp;gt;const int ARRA...原创 2018-07-11 00:29:03 · 1707 阅读 · 0 评论 -
Linux下的hexdump用法一例:分析鼠标事件
在linux下有时我们需要观察键盘或鼠标等外设的原始输入事件,可以选择编写一个小程序,读相应的设备然后打印出来,但是这种方法稍显麻烦,可能没个10分钟搞不定。还可以使用另一种方式:直接使用机器上自带的一些程序观察输入事件。 如果只是要观察有无输入事件上来,那么只使用cat就够了,假如我们要观察鼠标设备(在我的机器上,鼠标设备是/dev/input/event6): $ sudo cat ...原创 2018-07-01 20:11:43 · 2378 阅读 · 0 评论 -
C++ 虚函数之一:对象内存布局
考虑这样三个类: Base1、Base2和Derived各有一个数据成员。Base1有两个虚函数A()和B(),Base2有两个虚函数C()和D(),Dervied继承了Base1和Base2,并重新实现了A()和C():public: Base1() { memset(&amp;Base1Data, 0x11, sizeof(Base1Data)); } vir...原创 2018-06-11 00:31:22 · 647 阅读 · 0 评论 -
C++虚函数之二:虚函数表与虚函数调用
继续前一篇《C++ 虚函数之一:对象内存布局》原创 2018-06-17 16:14:32 · 2475 阅读 · 1 评论