翻译下,shmget设置EINVAL错误码的原因为下列之一:
- 要创建的共享内存段比 SHMMIN小 (一般是1个字节)
- 要创建的共享内存段比 SHMMAX 大 (内核参数kernel.shmmax配置)
- 指定key的共享内存段已存在,其大小和调用shmget时传递的值不同 。
ipcs-m | grep 41400keyshmidownerpermsbytesnattchstatus0x00041400 1015822root666300955161
可以看到,已经0x41400这个key已经存在,并且其大小为30095516字节,和我们调用参数中的30097568不匹配,于是产生了这个错误 。在我们这个案例里面,导致共享内存大小不一致的原因,是一组程序中,其中一个编译为32位,另外一个编译为64位,代码里面使用了long这个变长int数据类型 。
把两个程序都编译为64解决了这个问题 。这里特别说下strace的-e trace选项 。
要跟踪某个具体的系统调用,-e trace=xxx即可 。但有时候我们要跟踪一类系统调用,比如所有和文件名有关的调用、所有和内存分配有关的调用 。
如果人工输入每一个具体的系统调用名称,可能容易遗漏 。于是strace提供了几类常用的系统调用组合名字 。
-e trace=file 跟踪和文件访问相关的调用(参数中有文件名)绝大多数情况,我们使用上面的组合名字就够了 。实在需要跟踪具体的系统调用时,可能需要注意C库实现的差异 。
-e trace=process 和进程管理相关的调用,比如fork/exec/exit_group
-e trace=network 和网络通信相关的调用,比如socket/sendto/connect
-e trace=signal 信号发送和处理相关,比如kill/sigaction
-e trace=desc 和文件描述符相关,比如write/read/select/epoll等
-e trace=ipc 进程见同学相关,比如shmget等
比如我们知道创建进程使用的是fork系统调用,但在glibc里面,fork的调用实际上映射到了更底层的clone系统调用 。使用strace时,得指定-e trace=clone, 指定-e trace=fork什么也匹配不上 。3、 性能分析
假如有个需求,统计Linux 4.5.4 版本内核中的代码行数(包含汇编和C代码) 。这里提供两个Shell脚本实现:
poor_script.sh:
!/bin/bash
total_line=0
while read filename; do
line=$(wc -l $filename | awk ‘{print $1}’)
(( total_line += line ))
done < <( find linux-4.5.4 -type f ( -iname ‘
推荐阅读
- 整理了60个Python小例子,拿来即用
- 中班下学期期末评语怎么写?
- 十个字内的生日短句有哪些?
- 空调不凉怎么办?
- 动物|日本再次推迟送回人气大熊猫香香:太受欢迎、今年底才能回家
- 关于早安的暖心短句有哪些?
- 关于桃花最出名的诗句有哪些?
- 怎么用简单的一句话发朋友圈?
- 宝宝满月的祝福语怎么说?给宝宝满月祝福语大全
- 用动作描写害怕的句子有哪些?