GNU/Linux话题
之初
不用我说,用过的都知道,帅呆了。一个程序只干一件事的哲学,串联起来征服了数字世界。在此记录GNU/Linux使用痕迹,又是一个身材匀称的胖子。
一些基础命令
hwclock
硬件时间设置就靠他。例如你可以把系统时间同步到硬件时间时间,也可以反向操作。下面的命令就是系统->硬件的同步过程。
date -s 07/20/2021
date -s 09:34:30
hwclock --systohc
xz
- 下面的命令可以可靠的解出xz格式的压缩文件,不要指望tar -xzvf 能帮咱们解开这样的文件。
xz -d you_file.tar.xz
- 压制一个xz格式的文件。
xz -z you_file_or_dir
sed
命令行下的三大神器之一,行编辑命令。看看下面的命令在干什么坏事。
例子1:删空行
#我删删删
sed -i "/^[ ]*$/d" target_text_file
例子2:删除换行符
windows文本与linux文本的纠结,在这里终结吧。你知道吗?\r的十六进制表示是0x0d,同样的情况,\n的十六进制表示是0x0a。
sed -i 's/\r$//' target_file
grep
干净漂亮
ps -ef |grep process_name |grep -v "grep"
xargs
牛哄哄的工具,有时候需要参数自动化处理,xargs是必备。
awk
神器之一:awk
基本格式:awk ‘{BEGIN some code} {some code} {END some code}’ 关注-F 选项。awk自秀一下吧。
统计代码行数
虽然wc -l ./*.cpp已能料理好这个事情,一切为了效果。
wc -l ./your_code_dir/*.cpp |awk '{BEGIN sum=0} {sum +=$1} {print sum}'
wc
wc -l target_text_file
tar
find
find /usr/bin -name "ls*"
git
git起步走
概念要明确。比如:commit id就很重要,后悔药都靠它了。HEAD,HEAD^和HEAD~100的区别要明白,它们都和回退相关。超长的版本号(commit id) 269ce5f6acae225…不要晕,时常只用前4,5个就可以匹配了。
看看下面常用的命令。
- git clone your_remote_repo.
- git log.
- git log --pretty=one
- git reset --hard HEAD^ 或者 git reset --hard commit_id
- git reflog 后滚后再前滚时,它是解药,可以帮助找到commit id.
- git init --bare your_repo_name 记得修改拥有者为git,chown -R git:git your_repo_name.
- git remote -v 在仓库中查看远程库地址。记得是在迁出代码的本地仓库中执行它。
在ubuntu12上安装git
1.在/etc/apt/sources.list中放置好的,快的源服务器,关键字:apt sources.list。
2.apt update 或者 apt-get update。
3.apt/-get install git。好了,基本可以干好了。
下面是添加源服务器的另一个办法。
在ubuntu下添加源后,在线安装apt install git .
添加源的命令如下:
add-apt-repository ppa:git-core/ppa
apt update
apt install git
gdb
gdb依然是类unix平台下调试程序的NB工具。目前我在嵌入式下用它调试代码。
1.关于gdb的自动测试.
一段简单的gdb调试脚本,gdb专用。
#debug_your_code.gdb
break your_code_file_name.c:line
commands 1
p your_code_var
continue
end
run
加载debug_your_code.gdb有两种方法:
- 交互模式下:进入gdb交互界面,file your_program, source debug_your_code.gdb
- 参数方式:gdb --batch --command=debug_your_code.gdb --args your_program
我更喜欢第2种方法。
需要注意的内容:编译时添加 -g编译选项。例如:在Qt环境下,在pro文件中添加:CONFIG += -g。
测试覆盖率工具
如果你的项目中测试覆盖率达到100%,那么恭喜你,不用接客户电话了。来点冰凉的水,清醒一下,100%那是什么存在?他只是个传说,努力的,绞尽脑汁的接近她,拥有她,你就成了。
gcov
GNU free的覆盖率检查工具。
编译选项中增加:-ftest-coverage -fprofile-arcs。编译后生成your_app_name.gcno。运行后生成your_app_name.gcda。就这么简单。接下来看下一条命令:lcov。
lcov
让你的gcda 可视化。做一下动作:
- lcov -c -d ./ -o your_app_name.info 该命令生成info文件,供第二条试用;
- genhtml -t “your_app_name” -s --legend -o html your_app_name.info 该命令生成html可视化文件,一目了然。
这里有进一步资料,凑合着看。遇见更好的内容,我会尽快追加。
modinfo
驱动的面纱,我用modinfo揭。
modinfo you_driver
insmod your_driver param_name_1=value1 param_name_2=value2
nm
目标二进制文件中,函数的名称是什么?nm带你一睹芳容。
nm -s your_binary_file
一些内存命令
pmap
通过进程ID查看进程的内存占用和分布情况。
pmap 1249 -x #这是我的实验进程
top
假设你想看进程的内存占用。粗略的显示。
top -p 1249
cat /proc/1249/status #可以更多内容
bash
它是GNU/Linux下流行的脚本解释器,网上的资料较多。这里记录特别的内容。
特点:对空格敏感,例如赋值号前后不能有空格,否则就头疼把,知道就好。
基础
逻辑比较操作
用于数值比较,测试语法:[ ],注意[]中需要填充空格
- -gt 大于 >
- -ge 大于等于 >=
- -lt 小于 <
- -lt 小于等于 <=
- -eq 等于 ==
if [ a -gt b ]; then
command
fi
循环控制
for , while,until.看一下例子,了解基础框架。
for item in list; do
command
done
for (( i=0; i<10; ++i ); do
command
done
while [ 1 ]; do
if [ -f file ]; then
break
fi
commmand
done
until [ -f quit ]; do
command
done
控制语句
if, select, case,看名知意思
if [ ! -f file ]; then
command
el[se/if]
command
fi
select name in "tigger" "rabbit" "wolf"; do
case ${name} in
"rabbit"|"wolf") break;;
"tigger") ;;
esac
done
&
timer.sh &
这里的&,用于开启一个sub-shell,在后台运行。可以通过fg取回到当前shell中,通过jobs查看sub-shell的运行状态。
技能特点:
- 调用者立即返回,返回为0,不阻塞后面的命令;
- 调用者shell退出后,sub-shell不会受其影响;
- sub-shell的输出仍在shell中输出;
nohup
真正的把sub-shell独立处理出来。接上节,让timer.sh放飞自我,自由翱翔一会儿。
nohup timer.sh &
一些函数
statfs
获取硬盘信息。
access
调试手段
导出异常文件-core
开放限制
查看是否允许导出,ulimit -c返回0表示关闭。使用ulimit -c unlimited 开放限制。
ulimit -c
ulimit -c unlimited
定制core的名称
- 通过修改 /proc/sys/kernel/core_uses_pid 文件可以让生成 core 文件名是否自动加上 pid 号。
例如 echo 1 > /proc/sys/kernel/core_uses_pid ,生成的 core 文件名将会变成 core.pid,其中 pid 表示该进程的 PID。 - 通过修改 /proc/sys/kernel/core_pattern 来控制生成 core 文件保存的位置以及文件名格式。
例如可以用 echo “/tmp/core-%e-%p-%t” > /proc/sys/kernel/core_pattern 设置生成的 core 文件保存在 “/tmp/” 目录下,文件名格式为 “core-命令名-pid-时间戳”。格式控制看这里.
%p - insert pid into filename 添加 pid
%u - insert current uid into filename 添加当前 uid
%g - insert current gid into filename 添加当前 gid
%s - insert signal that caused the coredump into the filename 添加导致产生 core 的信号
%t - insert UNIX time that the coredump occurred into filename 添加 core 文件生成时的 unix 时间
%h - insert hostname where the coredump happened into filename 添加主机名
%e - insert coredumping executable name into filename 添加命令名
gdb
objdump
objdump -tT your/lib/path/libname #查看动态或静态库中的函数名称
神奇的编辑器
vim
这是一个神奇的编辑器,不用鼠标,只用键盘就能超速搞定你那一亩三分地儿。主要是有意思。
快速查找其他引用位置
移动光标到待查找的单词,按下SHIFT+ *,让后敲n(find next one)。也许开启高亮更直观。进入命令模式,set hlsearch可以开启高亮,相反,set nohlsearch关闭之。
emacs
嵌入式
关于设备时间
- 查看/etc/profile文件内容, 并在文件尾部增加以下代码。简单粗暴有效。需要注意软件中通过系统函数获取的时间是否符合预期,是否需要减少或增加8小时。关联的命令hwclock。
TZ="UTC-08:00"
export TZ
Win10下的Linux
必须说
原因只有一个,习惯了GNU/Linux命令的好。在Win10上轻装上阵即可,其他不论。不谈虚拟机,不谈WSL,不谈cygwin,只讲git-bash。
应用两篇文章,咱们的win中linux足矣。
第一篇来这里.
第二篇在这里.
如果第二篇不能访问,看第一篇基本无恙。
网络通信
内部进程通信
网络资料
Unix domain socket,进程间内部通信,这篇文章写的简单明了。
制作Ubuntu的ISO
以下链接中描述的内容,我没有亲自实验。先搬移进来,备用。
关于制作ubuntu系统ISO的简要说明