Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15309596
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类: LINUX

2009-06-30 14:46:05

1.编译我们监控uevnt的ghotplug源码

#include <stdio.h>
#include <syslog.h>

extern char **environ;

int main(int argc, char *argv[])
{
    int i;
    // 因为ghotplug将被同时启动数个,所以如下log信息会在/var/log/syslog中将被分段

    
    openlog("gliethttp", LOG_PID, LOG_DAEMON);

    syslog(LOG_EMERG, "=====\n");

    for (i = 0; i < argc; i++) {
        syslog(LOG_EMERG, "%s\n", argv[i]);
    }

    // getenv

    for (i = 0; environ[i]; i++) {
        syslog(LOG_EMERG, "%s\n", environ[i]);
    }

    syslog(LOG_EMERG, "+++++\n");

    closelog();
    
    return 0;
}

luther@gliethttp:/vobs/tmp$ gcc -o ghotplug ghotplug.c
luther@gliethttp:/vobs/tmp$ strip -s ghotplug
luther@gliethttp:/vobs/tmp$ sudo cp ghotplug /sbin/

2.设置内核调用uevent_helper的程序路径

内核代码片段如下:
    /* call uevent_helper, usually only enabled during early boot */
    if (uevent_helper[0]) {
        char *argv [3];

        argv [0] = uevent_helper;
        argv [1] = (char *)subsystem;
        argv [2] = NULL;
        retval = add_uevent_var(env, "HOME=/");
        if (retval)
            goto exit;
        retval = add_uevent_var(env,
                    "PATH=/sbin:/bin:/usr/sbin:/usr/bin");
        if (retval)
            goto exit;
// enum umh_wait {

//     UMH_NO_WAIT = -1,    /* don't wait at all */

//     UMH_WAIT_EXEC = 0,    /* wait for the exec, but not the process */

//     UMH_WAIT_PROC = 1,    /* wait for the process to complete */

// };

        call_usermodehelper(argv[0], argv, env->envp, UMH_WAIT_EXEC); // 所以这里只是等待exec调用完成,并不是等待ghotplug执行完毕,

// 所以如果ghotplug需要打印log,那么应为ghotplug可能会被同时启动好几个,而不出现log数据显示错序的现象,

// 如果对log信息要求比较严格,那么可以使用互斥机制保护,log信息严格的顺序性[luther.gliethttp]

    }

root@gliethttp:/sys/kernel# cat uevent_seqnum
2994
root@gliethttp:/sys/kernel# cat uevent_helper

root@gliethttp:/sys/kernel# echo '/sbin/ghotplug' >uevent_helper
root@gliethttp:/sys/kernel# cat uevent_helper
/sbin/ghotplug

3.插拔u盘或者任何可发生dev添加的动作
因为每发生一个uevent都将重新加载用户空间的/sbin/ghotplug应用程序,
对cpu来说这无疑是一个巨大的消耗,所以使用netlink才有实际意义,hotplug早晚被踢出局[luther.gliethttp]

luther@gliethttp:~$ tail -n 100 /var/log/syslog
Jun 30 14:40:48 gliethttp gliethttp[15324]: MINOR=140
Jun 30 14:40:48 gliethttp gliethttp[15324]: DEVTYPE=usb_device
Jun 30 14:40:48 gliethttp gliethttp[15324]: DEVICE=/proc/bus/usb/002/013
Jun 30 14:40:48 gliethttp gliethttp[15324]: PRODUCT=67b/2303/300
Jun 30 14:40:48 gliethttp gliethttp[15324]: TYPE=0/0/0
Jun 30 14:40:48 gliethttp gliethttp[15324]: BUSNUM=002
Jun 30 14:40:48 gliethttp gliethttp[15324]: DEVNUM=013
Jun 30 14:40:48 gliethttp gliethttp[15324]: SEQNUM=3083
Jun 30 14:40:48 gliethttp gliethttp[15324]: HOME=/
Jun 30 14:40:48 gliethttp kernel: [23875.391883] usb 2-2: configuration #1 chosen from 1 choice
Jun 30 14:40:48 gliethttp gliethttp[15330]: =====
Jun 30 14:40:48 gliethttp gliethttp[15333]: =====
Jun 30 14:40:48 gliethttp gliethttp[15334]: =====
Jun 30 14:40:48 gliethttp gliethttp[15324]: PATH=/sbin:/bin:/usr/sbin:/usr/bin
Jun 30 14:40:48 gliethttp kernel: [23875.396276] pl2303 2-2:1.0: pl2303 converter detected
Jun 30 14:40:48 gliethttp gliethttp[15336]: =====
Jun 30 14:40:48 gliethttp gliethttp[15330]: /sbin/ghotplug
Jun 30 14:40:48 gliethttp gliethttp[15344]: =====
Jun 30 14:40:48 gliethttp gliethttp[15333]: /sbin/ghotplug
Jun 30 14:40:48 gliethttp gliethttp[15340]: =====
Jun 30 14:40:48 gliethttp gliethttp[15346]: =====
Jun 30 14:40:48 gliethttp gliethttp[15334]: /sbin/ghotplug
Jun 30 14:40:48 gliethttp gliethttp[15324]: +++++
Jun 30 14:40:48 gliethttp kernel: [23875.449180] usb 2-2: pl2303 converter now attached to ttyUSB0
Jun 30 14:40:48 gliethttp gliethttp[15336]: /sbin/ghotplug
Jun 30 14:40:48 gliethttp gliethttp[15330]: usb
Jun 30 14:40:48 gliethttp gliethttp[15344]: /sbin/ghotplug
Jun 30 14:40:48 gliethttp gliethttp[15333]: usb-serial
Jun 30 14:40:48 gliethttp gliethttp[15340]: /sbin/ghotplug
Jun 30 14:40:48 gliethttp gliethttp[15346]: /sbin/ghotplug
Jun 30 14:40:48 gliethttp gliethttp[15334]: tty
Jun 30 14:40:48 gliethttp gliethttp[15336]: usb_endpoint
Jun 30 14:40:48 gliethttp gliethttp[15330]: ACTION=add
Jun 30 14:40:48 gliethttp gliethttp[15344]: usb_endpoint
Jun 30 14:40:48 gliethttp gliethttp[15333]: ACTION=add
Jun 30 14:40:48 gliethttp gliethttp[15340]: usb_endpoint
Jun 30 14:40:48 gliethttp gliethttp[15346]: usb_endpoint
Jun 30 14:40:48 gliethttp gliethttp[15334]: ACTION=add
Jun 30 14:40:48 gliethttp gliethttp[15336]: ACTION=add
Jun 30 14:40:48 gliethttp gliethttp[15330]: DEVPATH=/devices/pci0000:00/0000:00:1a.1/usb2/2-2/2-2:1.0
Jun 30 14:40:48 gliethttp gliethttp[15344]: ACTION=add
Jun 30 14:40:48 gliethttp gliethttp[15333]: DEVPATH=/devices/pci0000:00/0000:00:1a.1/usb2/2-2/2-2:1.0/ttyUSB0
Jun 30 14:40:48 gliethttp gliethttp[15340]: ACTION=add
Jun 30 14:40:48 gliethttp gliethttp[15346]: ACTION=add
Jun 30 14:40:48 gliethttp gliethttp[15334]: DEVPATH=/devices/pci0000:00/0000:00:1a.1/usb2/2-2/2-2:1.0/ttyUSB0/tty/ttyUSB0
Jun 30 14:40:48 gliethttp gliethttp[15336]: DEVPATH=/devices/pci0000:00/0000:00:1a.1/usb2/2-2/2-2:1.0/usb_endpoint/usbdev2.13_ep81
Jun 30 14:40:48 gliethttp gliethttp[15330]: SUBSYSTEM=usb
Jun 30 14:40:48 gliethttp gliethttp[15344]: DEVPATH=/devices/pci0000:00/0000:00:1a.1/usb2/2-2/2-2:1.0/usb_endpoint/usbdev2.13_ep83
Jun 30 14:40:48 gliethttp gliethttp[15333]: SUBSYSTEM=usb-serial
Jun 30 14:40:48 gliethttp gliethttp[15340]: DEVPATH=/devices/pci0000:00/0000:00:1a.1/usb2/2-2/2-2:1.0/usb_endpoint/usbdev2.13_ep02
Jun 30 14:40:48 gliethttp gliethttp[15346]: DEVPATH=/devices/pci0000:00/0000:00:1a.1/usb2/2-2/usb_endpoint/usbdev2.13_ep00
Jun 30 14:40:48 gliethttp gliethttp[15334]: SUBSYSTEM=tty
Jun 30 14:40:48 gliethttp gliethttp[15336]: SUBSYSTEM=usb_endpoint
Jun 30 14:40:48 gliethttp gliethttp[15330]: DEVTYPE=usb_interface
Jun 30 14:40:48 gliethttp gliethttp[15344]: SUBSYSTEM=usb_endpoint
Jun 30 14:40:48 gliethttp gliethttp[15333]: SEQNUM=3085
Jun 30 14:40:48 gliethttp gliethttp[15340]: SUBSYSTEM=usb_endpoint
Jun 30 14:40:48 gliethttp gliethttp[15346]: SUBSYSTEM=usb_endpoint
Jun 30 14:40:48 gliethttp gliethttp[15334]: MAJOR=188
Jun 30 14:40:48 gliethttp gliethttp[15336]: MAJOR=253
Jun 30 14:40:48 gliethttp gliethttp[15330]: DEVICE=/proc/bus/usb/002/013
Jun 30 14:40:48 gliethttp gliethttp[15344]: MAJOR=253
Jun 30 14:40:48 gliethttp gliethttp[15333]: HOME=/
Jun 30 14:40:48 gliethttp gliethttp[15340]: MAJOR=253
Jun 30 14:40:48 gliethttp gliethttp[15346]: MAJOR=253
Jun 30 14:40:48 gliethttp gliethttp[15334]: MINOR=0
Jun 30 14:40:48 gliethttp gliethttp[15336]: MINOR=18
Jun 30 14:40:48 gliethttp gliethttp[15330]: PRODUCT=67b/2303/300
Jun 30 14:40:48 gliethttp gliethttp[15344]: MINOR=20
Jun 30 14:40:48 gliethttp gliethttp[15333]: PATH=/sbin:/bin:/usr/sbin:/usr/bin
Jun 30 14:40:48 gliethttp gliethttp[15340]: MINOR=19
Jun 30 14:40:48 gliethttp gliethttp[15346]: MINOR=21
Jun 30 14:40:48 gliethttp gliethttp[15334]: SEQNUM=3086
Jun 30 14:40:48 gliethttp gliethttp[15336]: SEQNUM=3087
Jun 30 14:40:48 gliethttp gliethttp[15330]: TYPE=0/0/0
Jun 30 14:40:48 gliethttp gliethttp[15344]: SEQNUM=3089
Jun 30 14:40:48 gliethttp gliethttp[15333]: +++++
Jun 30 14:40:48 gliethttp gliethttp[15340]: SEQNUM=3088
Jun 30 14:40:48 gliethttp gliethttp[15346]: SEQNUM=3090
Jun 30 14:40:48 gliethttp gliethttp[15334]: HOME=/
Jun 30 14:40:48 gliethttp gliethttp[15336]: HOME=/
Jun 30 14:40:48 gliethttp gliethttp[15330]: INTERFACE=255/0/0
Jun 30 14:40:48 gliethttp gliethttp[15344]: HOME=/
Jun 30 14:40:48 gliethttp gliethttp[15340]: HOME=/
Jun 30 14:40:48 gliethttp gliethttp[15346]: HOME=/
Jun 30 14:40:48 gliethttp gliethttp[15334]: PATH=/sbin:/bin:/usr/sbin:/usr/bin
Jun 30 14:40:48 gliethttp gliethttp[15336]: PATH=/sbin:/bin:/usr/sbin:/usr/bin
Jun 30 14:40:48 gliethttp gliethttp[15330]: MODALIAS=usb:v067Bp2303d0300dc00dsc00dp00icFFisc00ip00
Jun 30 14:40:48 gliethttp gliethttp[15344]: PATH=/sbin:/bin:/usr/sbin:/usr/bin
Jun 30 14:40:48 gliethttp gliethttp[15340]: PATH=/sbin:/bin:/usr/sbin:/usr/bin
Jun 30 14:40:48 gliethttp gliethttp[15346]: PATH=/sbin:/bin:/usr/sbin:/usr/bin
Jun 30 14:40:48 gliethttp gliethttp[15334]: +++++
Jun 30 14:40:48 gliethttp gliethttp[15336]: +++++
Jun 30 14:40:48 gliethttp gliethttp[15330]: SEQNUM=3084
Jun 30 14:40:48 gliethttp gliethttp[15344]: +++++
Jun 30 14:40:48 gliethttp gliethttp[15340]: +++++
Jun 30 14:40:48 gliethttp gliethttp[15346]: +++++
Jun 30 14:40:48 gliethttp gliethttp[15330]: HOME=/
Jun 30 14:40:48 gliethttp gliethttp[15330]: PATH=/sbin:/bin:/usr/sbin:/usr/bin
Jun 30 14:40:48 gliethttp gliethttp[15330]: +++++
luther@gliethttp:~$
阅读(3376) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~