linux sysfs(3)
我一直有一个看法,就是有些程序是变态写出来的。我认为最有可能变态三个语言就是1)C语言2)make语言3)shell脚本
随便举几个例子
1)C语言
void mystrcat(char *d , char *s )
{
while(*d) d++;
while(*s) *(d++) = *(s++);
*d = '\0';
}
int mystrcmp(char *s , char *t )
{
while( *s && *t && *s == *t ) s++,t++;
return *s - *t;
}
2)make语言
.PHONY: shar
shar: $(SRCS) $(AUX)
shar $(SRCS) $(AUX) | compress \
> tar-`sed -e '/version_string/!d' \
-e 's/[^0-9.]*\([0-9.]*\).*/\1/' \
-e q
version.c`.shar.Z
.PHONY: dist
dist: $(SRCS) $(AUX)
echo tar-`sed \
-e '/version_string/!d' \
-e 's/[^0-9.]*\([0-9.]*\).*/\1/' \
-e q
version.c` > .fname
-rm -rf `cat .fname`
mkdir `cat .fname`
ln $(SRCS) $(AUX) `cat .fname`
tar chZf `cat .fname`.tar.Z `cat .fname`
-rm -rf `cat .fname` .fname
3)shell脚本
#!/usr/bin/ksh
exit_msg() {
[[ $# -gt 1 ]] && echo "${0##*/} (${1}) - ${2}"
exit ${1:-0}
}
[[ $# -lt 2 ]] && exit_msg 0 "Usage: ${0##*/} <file name #1> <file name #2>
for _FNAME in $@
do
[[ ! -f "${_FNAME}" ]] && exit_msg 1 "Unable to find file '${_FNAME}'"
[[ ! -r "${_FNAME}" ]] && exit_msg 2 "Unable to read file '${_FNAME}'"
gzip ${_FNAME}
ls -l ${_FNAME}.gz
done
怎么样,像不像火星语?我一直觉得就是。我认为现在这个时代喜欢这样写的人,不是变态,就是暴露狂-炫耀。
如果打比喻来讲的话,我认为,这种写法类似于文言文,而java等更高级的原因写法,才是现在正常人的文档。文言文当时这样写,也是被迫无奈,当时的字是写在竹子上,你相信如果把金庸的“飞雪连天射白鹿,笑书神侠倚碧鸳”都刻在一张张竹片上,我估计整个首都图书馆也就是填满了。难怪孔子长佩刀,原来古代读书也是一门体力活。
现在不同了,现在一个硬盘,几乎可以装下所有的古代文章,我们这个时候就没有必要之乎者也了,除非你是为了得瑟。别跟我说什么美感,我觉得红楼使用近现代语言也是挺美的,朱自清的荷塘月色也能够表达出意境。
所以,写程序也是一样,30年前,cpu才十几兆,内存才几K,硬盘也就那么一点点,所以,我们写程序必须精炼,越简单而且能靠近机器语言也好。现在这个社会,完全没有必要了,随便一个硬盘几百个T,随便一个CPU,好几个内核,主频还是2G多。所以这个时候,我们应该更用接近人类语言和思维方式的语言来写程序,不要和我说什么效率,效率可以从编译器和硬件架构来优化。
所以,还这样写的人,只有两种可能,第一种是疯子,第二种得瑟,炫耀自己水平。
我有一个梦想,有一天,把金庸小说输入电脑,然后电脑就帮你运行了,然后自动出来一部电影,这样我们就不必忍受令狐冲和东方不败的断背之痛苦了。
理想很丰满,现实很骨感,现在你和我还得忍受这种天书的痛苦,言归正传,下面我们正式讨论sysfs中的kset和kobject,不过,我不想使用火星语来描述,我更想使用我们地球人的语言来描述。
好了,一个全球跨国公司SYSFS的全球运动会斯皮罗(cipmylo)开幕了,现在是开幕式。
首先,所用员工入场,不要意思,与民同乐,所有员工必须参加,所以,运动员也是员工。首先公交车对入场了,美丽的礼仪小姐,举着大牌子,上面写着bus,胸口贴着一个小牌字,还写着很多小字。后面跟着一排礼仪小姐,手里也有牌子。
现在koject的概念出来了,什么是koject,我告诉你,kobect就是人,不管你是礼仪小姐也好,是运动员也好,还是管理人员也好,人+胸口的小牌子就是kobject。那么什么是kset,不要意思,礼仪小姐就是kset,虽然他不是公司的人,不是员工,但是,她就是kset,他牌子上有个指针,指向第一个bus的礼仪小姐,第一个礼仪小姐胸针上写着第二个礼仪小姐,最后一个礼仪小姐又写着礼仪小姐bus0。为什么要这样,因为他们中间要做方队编号,最后一个必须知道头在那里。
Kset:BUS(礼仪小姐0)<-----------------------------------------------------------------------------------------------------------
| |
| |
K_bus:hid(礼仪小姐1)--->K_bus:I2c(礼仪小姐2)--->K_bus:pci(礼仪小姐3)--->K_bus:usb(礼仪小姐4)--->...K_bus:mmc(礼仪小姐n)
哈哈,阵容出来了。这就是第一排和第二排的情况,其实还有第三排呢。第三排也是人,不过一一批特殊的人,什么特殊的人,就是家属,注意,是家属,不是配偶,也就是说,可能是爷爷奶奶来,也可能是老婆孩子,也可能是表哥表妹,不过最好不要让表哥表妹来,容易引起家庭矛盾。
公司忒抠门,规定了不管你家族有多少人在公司,但是能来参加运动员的家属只给一名。所以,虽然你兄弟俩在不同部门上班,不要意思,你们老爸老妈只能来一个。
这些家属也都有一个牌子,上面写着driver,driver旁边,还放了一个假的机器人,就是在公司的员工的假人。真人在哪里?答曰,真人在devices那个方队呢。
这个有一个问题,就是研发总监的家属应该站在谁的后头,当然是总经理的那个方队里面了。这个要注意,所以,usb的控制器,要放在pci的方阵里面。对了,家属就是k_driver.所以,先成家,再立业,家属永远在背后默默支持你。
当然了,这些家属和负责他们部门的对应礼仪小姐,也是形成一个双向链表的。
ok。bus方队过完了,下面是真正的员工出场了。员工出场也有一个礼仪小姐,牌子上写着devices,当然这个礼仪小姐也是kset。
后面全部都是公司员工了,第二排是总经理,研发老大,采购老大,销售老大,当然,这要看公司的具体组织架构。例如下面的架构:
breakpoint isa pci0000:00 pnp0 rapidio system virtual
cpu LNXSYSTM:00 platform pnp1 software tracepoint
platform:总经理办公室主任
pci:外协办公室
cpu:总经理
...
这样编排或许有些奇怪:
好了,下面到了第三排了,第三排基本还是各个部门的老大,我们来看看platform:
alarmtimer Fixed MDIO bus.0 i8042 power serial8250
eisa.0 floppy.0 pcspkr reg-dummy uevent
还是各个部门的老大,你可以认为是人力资源部老大,还有行政后勤部老大,还有财务部老大。
到了第四排。我们来看看pci的第四排吧。例如
/sys/devices/pci0000:00/0000:00:07.1$ ls
ata1 driver modalias resource2
ata2 enable msi_bus resource3
broken_parity_status firmware_node power resource4
class host0 remove subsystem
config host1 rescan subsystem_device
consistent_dma_mask_bits irq resource subsystem_vendor
device local_cpulist resource0 uevent
dma_mask_bits local_cpus resource1 vendor
---------------------------------------------------------------
你可以认为这里是一个研发中的,其中ata1就是软件一部,ata2就是软件二部,host0,硬件一部,host1,硬件二部。其他呢?其他公司架构的东西,以后再表。
好了,我们就这样走完员工方队了。折腾折腾,开模式结束了。
下面就到class,class是什么,class就是运动场馆站着的礼仪小姐,上面写着运动员,其实是class,英文中文不是一一对应,这里注意理解哦。
他的后面站着另外一排礼仪小姐,这些礼仪小姐和刚刚走方队的一样,也是链表和第一排连接在一起,其都是class类型,但是名字分别是
/sys/class$ ls
ata_device devfreq hwmon net rtc spi_transport
ata_link dma i2c-adapter pci_bus scsi_device thermal
ata_port dmi input power_supply scsi_disk tty
backlight drm leds ppdev scsi_generic usbmon
bdi firmware mdio_bus ppp scsi_host vc
block gpio mem printer sound vtconsole
bluetooth graphics misc regulator spi_host
bsg hidraw mmc_host rfkill spi_master
上面我们可以理解为调高,跳远,游泳,跳水,足球,篮球,反正足够你比喻的。
到了第三排了,第三排就是实际的员工运动员了。前面我们说了,虽然运动会大家必须参与,但是参与的意思是你到场参加任何活动都可以,不一定是比赛,所以,这里只有部门员工在第三排。他们站在哪一个队伍里面就表示他们将参加哪一个类型的比赛。
------------华丽的分割线-----------------------
到此,人物都搞定了,等着比赛吧,不知道金牌怎么样,不过黄金好像跌价了。
明天我们结合这个必须我们认真看看火星文的数据结构。