文章目录
- 简介
- Linux 软件编译
- 提示非需要安装的名称
- Kernel相关
- kvm
- skbuff
- 编译错误提示隐晦
- barrier 宏
- clone 函数
- iostat
- __getname、__putname
- 语言相关
- C
- scanf
- C标准n1570,关于typedef的一个例子:
- C++
- Effective C++, 09 item;
- 模板定义
- 宏对于魔数的定义
- python
- 退出
- 软件
- ip
- qemu
- rpm
- 标准
- acpi
- 编程规范
简介
这里简单评论一些所见非所得的代码,设计。。。
可能导致初学者的抗拒。
Linux 软件编译
提示非需要安装的名称
导致不好找原因。
[root@rms01-host01 rpmbuild]# rpmbuild -bp SPECS/qemu-kvm.spec
error: Failed build dependencies:
pkgconfig(epoxy) is needed by qemu-kvm-15:6.2.0-11.el8.2.x86_64
pkgconfig(gbm) is needed by qemu-kvm-15:6.2.0-11.el8.2.x86_64
pkgconfig(libdrm) is needed by qemu-kvm-15:6.2.0-11.el8.2.x86_64
pkgconfig(xkbcommon) is needed by qemu-kvm-15:6.2.0-11.el8.2.x86_64
[root@rms01-host01 rpmbuild]# dnf install libxkbcommon-devel libepoxy-devel libdrm-devel libgbm-devel
Kernel相关
kvm
kvm.ko 的入口函数是 vmx_init。其实也算搞反的一个例子。
skbuff
static inline void skb_reset_network_header(struct sk_buff *skb)
{
skb->network_header = skb->data - skb->head;
}
这里network_header 其实是一个长度,就是说 network-header有多长。但是根据单词的字面理解,看不出是长度。
编译错误提示隐晦
https://blog.csdn.net/qq_36428903/article/details/125924437
barrier 宏
https://blog.csdn.net/qq_36428903/article/details/124543474
这里的barrier函数其实根据字面理解的意思,不能理解其真正的含义。需要有额外的修饰词,才能完整的表达其含义。
clone 函数
#所见非所得# CLONE在这里指clone函数而非克隆的意思 FILES的含义是共享文件
https://blog.csdn.net/qq_36428903/article/details/124564276
这个函数被改成了:IDTENTRY_SYSVEC形式的定义;新的方式,有一个特性就是:所见非所得。导致对于新手来说非常的不友好,检索起来非常的麻烦。怎么让IDE可以索引这种形式的函数?
iostat
Systems Performance Enterprise and the Cloud
这本书里也有提到这么个例子;
The name “iostat” is short for “I/O statistics,” although it might have been better to call it “diskiostat” to reflect the type of I/O it reports. This has led to occasional confusion when a user knows that an application is performing I/O (to the
file system) but wonders why it can’t be seen via iostat(1) (the disks).
__getname、__putname
下面这两个宏的定义也是非常的具有迷惑性,谁能想到只是内存的申请。
#define __getname() kmem_cache_alloc(names_cachep, GFP_KERNEL)
#define __putname(name) kmem_cache_free(names_cachep, (void *)(name))
语言相关
C
scanf
scanf,这个scanf的格式串里不能有逗号,或者其他的符合分割。这样就和想象的不太一样。按照正常的思维,需要一个逗号分割一下。
比如 scanf(“%d, %d”, &i, &j); 这里的逗号就是多余的字符。加上这个逗号就会出现问题。
C标准n1570,关于typedef的一个例子:
6.7.8, 例子: typedef int MILES, KLICKSP(); 这个声明只后:
MILES distance; 这个distance是一个int类型的变量;
extern KLICKSP *metricp; metricp是一个指向无参数并且返回int的函数的指针; 这个指针的定义就是和正常的思维/逻辑有点冲突。
按照第一个int类型的同义词的定义个数,前面是要被替换的类型,后面是重新定义的一个类型别名。
跟着第一个例子的逻辑,第二个 typedef int funcp(); 这个格式就很难理解。
相似的:typedef char char40[40];这里的也很难理解,谁能一下子理解char40是一个 char类型的一个一维数组,40个元素。
https://stackoverflow.com/questions/4523497/typedef-fixed-length-array
https://cplusplus.com/forum/beginner/166041/
如果这样的类型作为函数参数,其实传递的是一个指针/引用。所以要注意,不要使用sizeof求长度。
[root@10 test]# cat typedef.c
#include <stdio.h>
typedef int a();
a *b;
typedef char a40[40];
a40 c;
int process(a40 a)
{
printf("address of a = 0x%x, a=0x%x\n", &a, a);
return 0;
}
int main()
{
a40 e;
printf("address of e = 0x%x, e=0x%x\n", &e,e);
process(e);
return 1;
}
[root@10 test]# ./a.out
address of e = 0x1805a4c0, e=0x1805a4c0
address of a = 0x1805a4a8, a=0x1805a4c0
C++
C++的发展,正在向着未知的方向进发。语法,格式越来越不能接受,不是不能看懂,是根本就不愿意看。虽然说很多的语法糖,但是要消耗这么多的语法糖,要消耗大量的大脑细胞。弯弯拐拐像走迷宫。如果有康庄大道,很难说服人去闯迷宫。
Effective C++, 09 item;
绝不要在构造和析构的函数里调用virtual的函数;因为对于继承来来说,初始化时,开始调用的函数就是构造,而且基类的构造要先于子类,二此时调用的话导致子类还没准备好,就开始调用子类的virtual函数,谁知道会发生什么呢。
模板定义
这里模板的参数明明是在前面定义的,为什么在使用时,会将参数放到名称后面。不能像函数定义那样?
template
struct Alloc { };
template
using Vec = vector<T, Alloc>; // type-id is vector<T, Alloc>
Vec v; // Vec is the same as vector<int, Alloc>
宏对于魔数的定义
如果使用裸魔数,就是一个所见即所得的例子。但是不利于维护,需要多走一步有利于代码的维护。
python
退出
quit,你要是敲这个单词,肯定退出不了,需要加一个双括号才能退出。这其实也是很难于理解,为什么解释器不能解释quit命令?
>>> quit
Use quit() or Ctrl-Z plus Return to exit
这个的含义是:quit 或者 exit不是python解释器支持的命令,如果要退出,需要调用quit函数
要是敲如:>>> help(quit()), 这个也可以将python解释器退出。
软件
ip
https://blog.csdn.net/qq_36428903/article/details/120267289#_142
错误提示与实际的问题不符。
qemu
qemu的这个错误提示看着是有点与实际的效果有些差距。
https://blog.csdn.net/qq_36428903/article/details/125882237
rpm
安装时依赖关系的展示,这个其实也是非常的不友好,如果可以直接展示rpm包会好一点。
error: Failed dependencies:
libdebuginfod.so.1()(64bit) is needed by dyninst-11.0.0-3.el8.x86_64
libdebuginfod.so.1(ELFUTILS_0.178)(64bit) is needed by dyninst-11.0.0-3.el8.x86_64
pkgconfig(zlib) is needed by elfutils-devel-0.186-1.el8.x86_64
pkgconfig(zlib) is needed by elfutils-libelf-devel-0.186-1.el8.x86_64
libdebuginfod.so.1()(64bit) is needed by systemtap-client-4.6-4.el8.x86_64
libdebuginfod.so.1(ELFUTILS_0.178)(64bit) is needed by systemtap-client-4.6-4.el8.x86_64
mokutil is needed by systemtap-client-4.6-4.el8.x86_64
openssh-clients is needed by systemtap-client-4.6-4.el8.x86_64
gcc is needed by systemtap-devel-4.6-4.el8.x86_64
libdebuginfod.so.1()(64bit) is needed by systemtap-devel-4.6-4.el8.x86_64
libdebuginfod.so.1(ELFUTILS_0.178)(64bit) is needed by systemtap-devel-4.6-4.el8.x86_64
libdebuginfod.so.1()(64bit) is needed by systemtap-runtime-4.6-4.el8.x86_64
libdebuginfod.so.1(ELFUTILS_0.178)(64bit) is needed by systemtap-runtime-4.6-4.el8.x86_64
标准
acpi
这个里面有定义下面几种类型的状态,但是对于C-states 却没有指明C代表什么意思。也许就是CPU。
ACPI定义的状态有:
– Global system power states (G-states, S0, S5)
– System sleeping states (S-states S1-S4)
– Device power states (D-states)
– Processor power states (C-states) (C是什么缩写,CPU,Control, Consumption)
– Device and processor performance states (P-states)
编程规范
https://blog.csdn.net/qq_36428903/article/details/128242350