• linux sysfs(3)


    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
    上面我们可以理解为调高,跳远,游泳,跳水,足球,篮球,反正足够你比喻的。
    到了第三排了,第三排就是实际的员工运动员了。前面我们说了,虽然运动会大家必须参与,但是参与的意思是你到场参加任何活动都可以,不一定是比赛,所以,这里只有部门员工在第三排。他们站在哪一个队伍里面就表示他们将参加哪一个类型的比赛。
    ------------华丽的分割线-----------------------
    到此,人物都搞定了,等着比赛吧,不知道金牌怎么样,不过黄金好像跌价了。
    明天我们结合这个必须我们认真看看火星文的数据结构。




  • 相关阅读:
    hibernate框架的搭建与简单实现增删改
    $.ajax();详解
    利用json实现数据传输
    利用ajax实现数据传输
    错误:Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp;的解决
    简单使用jstl实现敏感字替换
    实用jstl实现未登录时不能绕过登录界面的效果
    简单实用jstl实现“登录|注册”
    简单实用jstl实现代码编写
    简单使用EL进行标签的替换
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3032235.html
Copyright © 2020-2023  润新知