分类目录归档:技术

根本解决C程序 ignoring return value of ‘***’

最近在移植一个 C 项目时出现如下报错:

xxxxxx.c:990:4: error: ignoring return value of ‘chroot’, declared with attribute warn_unused_result [-Werror=unused-result]
  990 |    chroot("/");

之所以报错等级为 Error ,是因为 GCC 编译具有参数 -Werror,将警告当作错误:

gcc -std=gnu99 -Wall -Werror -Wno-unknown-pragmas -Wno-strict-aliasing -Wpedantic -g -O2 -Wl,-z,relro -I. -D_FILE_OFFSET_BITS=64 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/fuse -c -o xxxxxx.o xxxxxx.c -MMD -MT pmxcfs.o -MF xxxxxx.o.d

去掉这一编译参数治标不治本。最根本的解决办法是去源码找到出问题的地方,处理一下返回值,或者这样手动忽略错误,并辅以注释:

- chown(RUNDIR, 0, cfs.gid);
+ # TODO 临时处理,忽略返回值
+ # 后期需根据实际情况处理错误码
+ if(chown(RUNDIR, 0, cfs.gid)){};

再次编译解决。

参考文献

Linux 使用 diff 分栏对比文本差异

首先看一下帮助文档:

$ diff --help  
用法:diff [选项]... 文件列表  
逐行比较<各文件>。  

长选项的必需参数也是相应短选项的必需参数。  
     --normal                  以正常的 diff 方式输出 (默认)  
 -q, --brief                   只有在文件不同时报告  
 -s, --report-identical-files  当两个一样时仍然显示结果  
 -c, -C NUM, --context[=NUM]   同时输出 NUM 行(默认为 3 行)的复制上下文内容  
 -u, -U 数量, --unified[=数量] 输出 <数量>(默认为 3)行一致化上下文  
 -e, --ed                      以 ed script 方式输出  
 -n, --rcs                     以 RCS diff 格式输出  
 -y, --side-by-side            以两栏的格式输出  
 -W, --width=数量              每行显示最多 <数量>(默认 130)个字符  
     --left-column             当有两行相同时只显示左边栏的一行  
     --suppress-common-lines   当有两行相同时不显示  

 -p, --show-c-function         显示每个变更位于哪个 C 函数中  
 -F, --show-function-line=正则 显示匹配给定<正则>表达式的最近一行  
     --label 标签              使用给定<标签>替代文件名和时间戳  
                                 (可以重复)  

 -t, --expand-tabs             将输出中的 tab 转换成空格  
 -T, --initial-tab             每行先加上 tab 字符,使 tab 字符可以对齐  
     --tabsize=数字           TAB 格的宽度,默认为 8 个打印列宽  
     --suppress-blank-empty    在空的输出行之前去除空白或制表符  
 -l, --paginate                将输出送至 “pr” 指令来分页  

 -r, --recursive                 连同所有子目录一起比较  
     --no-dereference            不要跟随符号链接  
 -N, --new-file                  不存在的文件以空文件方式处理  
     --unidirectional-new-file   若第一文件不存在,以空文件处理  
     --ignore-file-name-case     忽略文件名大小写的区别  
     --no-ignore-file-name-case  不忽略文件名大小写的区别  
 -x, --exclude=模式              排除匹配 <模式> 的文件  
 -X, --exclude-from=文件         排除所有匹配在<文件>中列出的模式的文件  
 -S, --starting-file=文件        当比较目录時,由<文件>开始比较  
     --from-file=文件1           将<文件1>和操作数中的所有文件/目录作比较;  
                                   <文件1>可以是目录  
     --to-file=文件2             将操作数中的所有文件/目录和<文件2>作比较;  
                                   <文件2>可以是目录  

 -i, --ignore-case               忽略文件内容大小写的区别  
 -E, --ignore-tab-expansion      忽略由制表符宽度造成的差异  
 -Z, --ignore-trailing-space     忽略每行末端的空格  
 -b, --ignore-space-change       忽略由空格数不同造成的差异  
 -w, --ignore-all-space          忽略所有空格  
 -B, --ignore-blank-lines        忽略任何因空行而造成的差异  
 -I, --ignore-matching-lines=正则 若某行完全匹配 <正则>,则忽略由该行造成的差异  

 -a, --text                      所有文件都以文本方式处理  
     --strip-trailing-cr         去除输入内容每行末端的回车(CR)字符  

 -D, --ifdef=名称                输出的内容以 ‘#ifdef <名称>’ 方式标明差异  
     --GTYPE-group-format=GFMT   以 GFMT 格式处理 GTYPE 输入行组  
     --line-format=LFMT          以 LFMT 格式处理每一行资料  
     --LTYPE-line-format=LFMT    以 LFMT 格式处理 LTYPE 输入的行  
   这些格式化选项提供对 diff 输出的精细控制,从而泛化 -D/--ifdef。  
   LTYPE 可以是 “old”、“new” 或 “unchanged”。GTYPE 可以是 LTYPE 的选择  
   或是 “changed”。  
   (仅)GFMT 可包括:  
     %<  该组中每行属于<文件1>的差异  
     %>  该组中每行属于<文件2>的差异  
     %=  该组中同时在<文件1>和<文件2>出现的每一行  
     %[-][宽度][.[精确度]]{doxX}字符  以 printf 格式表示该<字符>代表的内容  
       大写<字符>表示属于新的文件,小写表示属于旧的文件。<字符>的意义如下:  
         F  行组中第一行的行号  
         L  行组中最后一行的行号  
         N  行数 ( =L-F+1 )  
         E  F-1  
         M  L+1  
     %(A=B?T:E)  如果 A 等于 B 那么 T 否则 E  
   (仅)LFMT 可包括:  
     %L  该行的内容  
     %l  该行的内容,但不包括结束的换行符  
     %[-][宽度][.[精确度]]{doxX}n  以 printf 格式表示的输入行号  
   GFMT 或 LFMT 都可包括:  
     %%        %  
     %c'C'     单个字符 C  
     %c'\OOO'  八进制码 OOO 所代表的字符  
     C         字符 C(处上述转义外的其他字符代表它们自身)  

 -d, --minimal            尽可能找出最小的差异集  
     --horizon-lines=数量 保持指定行数的一致前后缀  
     --speed-large-files  假设文件十分大而且文件中含有许多微小的差异  
     --color[=何时]       给输出上色;“何时”可以是“never”(从不)、  
                            “always”(总是)或“auto”(自动,默认);  
                            仅指定 --color 与 --color='auto' 效果相同  
     --palette=调色板     在 --color 选项启用时使用的颜色;<调色板>参数应当是  
                            一个冒号分隔的列表以提供 terminfo capabilities 信息  

     --help               显示此帮助信息并退出  
 -v, --version            输出版本信息并退出  

 <文件列表> 的格式可以是“文件1 文件2”、“目录1 目录2”、“目录 文件”或  
     “文件 目录”。  
如果使用 --from-file 或 --to-file 选项,<文件名> 的格式则不受限制。  
如果 FILE 是 “-”,则由标准输入读取内容。  
如果输入相同,则退出状态为 0;1 表示输入不同;2 表示有错误产生。  

报告程序错误到: bug-diffutils@gnu.org  
报告翻译错误到: https://translationproject.org/teams/zh_CN.html  
GNU diffutils 主页: <https://www.gnu.org/software/diffutils/>  
使用 GNU 软件的通用帮助:<https://www.gnu.org/gethelp/>

用的时候可以横排查看不同的地方:

$ diff pmxcfs.kylin.e pmxcfs.debian10.e -y -W 180

使用 -y 表示两列查看,使用 -W 设定宽度,这样就可以在终端里分栏查看文件差异:

参考文献

linux grep 过滤多个单词

有时会需要使用 grep 做多关键词匹配,这里给出集中方法,简单记录:

grep 'word1\|word2\|word3' /path/to/file
### Search all text files ###
$ grep 'word*' *.txt
### Search all python files for 'wordA' or 'wordB' ###
$ grep 'wordA*'\''wordB' *.py
$ grep -E 'word1|word2' *.doc
$ grep -e string1 -e string2 *.pl
$ grep -E "word1|word2" *.c
### Show all the lines that do not match given pattern/words/strings ###
$ grep -v 'bar\|foo' /dir1/dir2/file1
$ grep -E -v 'pattern1|pattern2' /path/to/file

参考文献

VMware ovftool arm zip 包安装

ovftool 是 VMware 提供的一款开放的导入、导出 OVF 格式虚拟机的 CLI 工具,支持 X86 和 Arm。

官方提供两种,一种是类似 .bundle 安装包,另一种是 zip 压缩包。本文介绍 zip 压缩包使用方法。

安装方法

第一步:获取软件包

获取 arm 安装包,建议通过官方途径下载,比如:

第二步:解压

解压,例如这样:

$ unzip VMware-ovftool-4.4.0-15722219-lin.aarch64.zip

第三步:配置环境变量

$ + export PATH=$PATH:/home/worker/ovftool
$ source .bashrc

第四步:使用

# ovftool --version
VMware ovftool 4.4.0 (build-15722219)

F&A

libcrypt.so.1 缺失

/root/ovftool/ovftool.bin: error while loading shared libraries: libcrypt.so.1: cannot open shared object file: No such file or directory

解决方案:

安装 libxcrypt-compat 软件包即可,比如这样:

# ArchLinux
$ pacman libxcrypt-compat

locale 设置错误

/root/ovftool/ovftool: line 10: warning: setlocale: LC_CTYPE: cannot change locale (en_US.UTF-8): No such file or directory

arch 下解决方案,

  1. 编辑 /etc/locale.gen,去掉 en_US.UTF-8 UTF-8 以及 zh_CN.UTF-8 UTF-8 行前的注释符号(#)
$ vim /etc/locale.gen

- #en_US.UTF-8 UTF-8
+ en_US.UTF-8 UTF-8
- #zh_CN.UTF-8 UTF-8
+ zh_CN.UTF-8 UTF-8
  1. 然后使用如下命令生成 locale:
$ locale-gen
  1. 向 /etc/locale.conf 输入内容:
$ echo 'LANG=en_US.UTF-8'  > /etc/locale.conf

参考文献

Linux USB 设备基础理论

通过扫描以下目录获取物理节点所有 USB 设备:

/sys/bus/usb/devices/usb*
/sys/bus/usb/devices/usb*/$busnum-*

从该文件系统收集某一个设备的主要信息如下:

{
    "busnum": 1,
    "class": 0,
    "devnum": 2,
    "level": 1,
    "manufacturer": "QEMU",
    "port": 0,
    "prodid": "0001",
    "product": "QEMU USB Tablet",
    "speed": "12",
    "usbpath": "1",
    "vendid": "0627"
}

文件含义

目录下部分文件含义如下:

  • busnum: 总线号
  • devnum: 设备号(该总线的第几台设备)
  • speed: 速率
  • bDeviceClass: 设备类型
  • idVendor: 设备的生产商ID,由USB设备生产商向USB-IF官方来统一管理和申请
  • idProduct: 该生产商生产的产品编号,同一厂商下的不同idProduct代表着该公司不同的产品系列
  • product: 制造商
  • manufacturer: 产品
  • serial: USB 硬件设备序列号 ,例如 0000:00:01.2

定位方法

定位某一个 USB 设备的方法有两种:

  • busnum + devnum
  • idVendor + idProduct

设备类型bDeviceClass

类代码 用法 描述
00h 设备描述符 Use class information in the interface Descriptors
01h 接口描述符 音频
02h 设备描述符、接口描述符 通讯设备,如电话,moden等等
03h 接口描述符 HID设备
05h 接口描述符 Physical
06h 接口描述符 Image
07h 接口描述符 打印机
08h 接口描述符 大容量存储
09h 设备描述符 Hub USB集线器
0Ah 接口描述符 CDC-Data
0Bh 接口描述符 Smart Card
0Dh 接口描述符 Content Security
0Eh 接口描述符 UVC视频/CAMERA
0Fh 接口描述符 Personal Healthcare
10h 接口描述符 音视频设备
11h 设备描述符 Billboard Device Class
12h 接口描述符 USB Type-C Bridge Class
DCh 设备描述符、接口描述符 Diagnostic Device
E0h 接口描述符 无线控制器
EFh 设备描述符、接口描述符 Miscellaneous
FEh 接口描述符 Application Specific
FFh 设备描述符、接口描述符 厂商用自定义

参考文献

使用 qemu-img 转换镜像格式

qemu-img镜像格式转换工具支持vhd、vmdk、qcow2、raw、vhdx、qcow、vdi或qed社区格式的镜像的相互转换。

查看信息

$ qemu-img info vzdump-qemu-125-2022_08_16-13_40_42.vma                                                                                                                                                                                    
image: vzdump-qemu-125-2022_08_16-13_40_42.vma                                                                                                                                                                                                                                
file format: raw                                                                                                                                                                                                                                                              
virtual size: 3 GiB (3221810176 bytes)                                                                                                                                                                                                                                        
disk size: 3 GiB

$ qemu-img info vzdump-qemu-125-2022_08_16-13_40_42.qcow2 
image: vzdump-qemu-125-2022_08_16-13_40_42.qcow2
file format: qcow2
virtual size: 3 GiB (3221810176 bytes)
disk size: 3 GiB
cluster_size: 65536
Format specific information:
    compat: 1.1
    compression type: zlib
    lazy refcounts: false
    refcount bits: 16
    corrupt: false
    extended l2: false

格式转换

执行如下命令转换镜像文件格式。

# 转换 vmdk 格式为 qcow2 格式
$ qemu-img convert -p -f vmdk -O qcow2 centos6.9.vmdk centos6.9.qcow2

# 转换 vma(raw) 为 qcow2
$ qemu-img convert -p -f raw -O qcow2 vzdump-qemu-125-2022_08_16-13_40_42.vma vzdump-qemu-125-2022_08_16-13_40_42.qcow2
    (100.00/100%)

上述命令中各参数对应的说明如下:

  • -p 标识转换的进度条。
  • -f 源镜像格式。
  • -O 目标镜像格式 + 源镜像文件名称 + 目标文件名称。

转换完成后,目标文件会出现在源镜像文件所在的目录下。

参考文献

Win11 手动调整任务栏大小 | 定制任务栏 2022

最近自己的 MacBook Air M1 资源吃紧,干起活来常常被内存拖累。

虽然平时都是远程开发,但终端一多,网页一多,很容易达到性能瓶颈导致工作效率下降。于是心生一计,在计算资源较充足的开发服务器上开一台高性能的桌面虚拟机,恰好此前一直没有使用过 Win11,趁此机会体验一下。

装好之后一切都好,就是嫌这个任务栏太大,不能像 Win10 那样直接调整为小任务栏。因此就有了这篇文章,介绍两种定制 Win11 任务栏的方法。

先看效果,再介绍方法。

调整前:

修改后:

怎么样,是不是省出了很多宝贵的桌面空间,下面介绍两种方法。

方法一 – 修改注册表(不推荐)

1、同时按下 win+r ,打开运行,在打开栏中输入 regedit ,然后按下回车确定调出注册表编辑器;

2、接着定位到注册表如下路径

HKEY_CURRENT_USER\Software\Microsoft\ Windows\CurrentVersion\Explorer\Advanced

3、右键右侧空白处,选择新建一个 DWORD 值,将它命名为 TaskbarSi;

4、双击打开这个 TaskbarSi 值,将 value data 更改为 重启之后就是小任务栏了。

(数字 是小任务栏,1 是中任务栏, 2 是大任务栏)。

该方法不需要安装第三方工具即可修改,但是适配很差,修改为小图标后,右下角会布局会乱,因此不推荐该方法。

方法二 – StartAllBack (推荐)

StartAllBack 是一款 Win11 开始菜单增强工具,能包括:开始菜单样式和操作、个性化任务栏及资源管理器等。

通过这个工具即可方便的定制 Win11 任务栏,甚至可以修改为 Win7 样式。

前往 StartAllBack 官网下载即可,如果打不开,可以在本站的 资源站 获取,安装包名为 StartAllBack_3.5.1_setup.exe

安装结束后可以在 C:\Program Files\StartAllBack 找到其可执行程序,运行即可定制,一看就懂。

总结

本文介绍了两种 Win11 任务栏的定制方法,同样的关键词在网络上能找到的大都是方法一,但是这种方法已经过时,因此就有了这篇文章。希望对你有用。

参考文献