Solaris 10下如何用Perl解析psinfo二进制文件
用Perl解析Solaris 10的/proc/psinfo二进制文件
我帮你梳理下怎么用Perl的unpack函数解码Solaris 10的/proc/[pid]/psinfo二进制文件——这玩意儿因为是二进制格式,得严格对应C结构体的内存布局来写模板才行。
第一步:明确结构体字段对应的Perl unpack格式
结合你给出的psinfo结构体片段,再参考Solaris官方proc(4)手册的完整定义,核心字段的C类型对应Perl unpack规则如下:
- Solaris上的
int、pid_t、uid_t、gid_t都是4字节整数:- SPARC架构(大端字节序)用
N表示4字节大端整数 - x86架构(小端字节序)用
V表示4字节小端整数 - 仅在本机运行的话,用
i(本机int)也没问题,但跨架构场景建议用明确的字节序符号
- SPARC架构(大端字节序)用
第二步:编写unpack模板并解析
针对你给出的那几个字段,我们可以先写一个基础示例脚本:
#!/usr/bin/perl use strict; use warnings; # 替换成你要查询的进程PID my $target_pid = 1234; my $psinfo_file = "/proc/$target_pid/psinfo"; # 以二进制模式打开文件 open my $fh, '<:raw', $psinfo_file or die "打不开$psinfo_file: $!"; # 读取前20字节(5个4字节字段) my $binary_data; read $fh, $binary_data, 20; close $fh; # 根据你的Solaris架构选择模板:SPARC用N5,x86用V5 my ($pr_flag, $pr_nlwp, $pr_nzomb, $pr_pid, $pr_ppid) = unpack 'N5', $binary_data; # 输出解析结果 print "进程ID: $pr_pid\n"; print "父进程ID: $pr_ppid\n"; print "活跃轻量级进程数: $pr_nlwp\n"; print "僵尸轻量级进程数: $pr_nzomb\n"; print "进程标志: $pr_flag\n";
第三步:扩展到完整结构体
如果要解析更多字段(比如进程组ID、用户ID等),你需要参考Solaris 10的proc(4)手册获取完整的psinfo结构体定义,然后按顺序扩展unpack模板。比如手册里接下来的字段是pr_pgid、pr_sid、pr_uid、pr_euid、pr_gid、pr_egid,那模板就可以改成N11(前面5个加后面6个,共11个4字节字段),再对应增加接收变量即可。
关键注意事项
- 字节序匹配:一定要根据你的Solaris架构选择正确的unpack字节序符号,否则解析出的数值会完全错误
- 字段顺序严格对应:unpack是按模板顺序依次解析二进制数据的,必须和C结构体的字段顺序完全一致
- 验证结果:可以用
ps -ef或者pstat命令的输出和脚本结果对比,确保解析正确
内容的提问来源于stack exchange,提问作者taiko
相关产品推荐
相关产品推荐

