LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1246|回复: 2

linux2.4内核下应用程序侦测U盘hotplug的代码遇到问题,请教高手。

[复制链接]
发表于 2007-12-17 14:21:18 | 显示全部楼层 |阅读模式
我自己的一个应用程序,其中需要对U盘hotplug事件进行监测,考虑效率需要,要求用信号机制。
听一位高手说用sigaction和fcntl辅以SIGURG信号可以实现,但是更详细的步骤就不知道了。

于是我先消化了一个socket中使用sigaction和SIGIO实现中断网络数据IO的方法,然后尝试着写了下面的代码,期望能够侦测U盘。

已知一个U盘插入时,用fdisk -l命令知道它在 /dev/sdb1 上,代码如下:

#include    <stdio.h>
#include    <unistd.h>
#include    <fcntl.h>
#include    <signal.h>

void inthandler(int s)
{
    printf(" Received signal %d .. waiting\n", s );
    sleep(1);
    printf("  Leaving inthandler \n");
}


main(int ac, char *av[])
{
    int fd;
    struct sigaction action;

    /* open file and fcntl */
    fd = open ("/dev/sdb1", O_RDONLY);
    if (-1 == fd)
    {
        perror ("open device file error");
    }

    /* set handler */
    memset(&action, 0, sizeof(action));
    action.sa_handler = inthandler;
    action.sa_flags = 0;

    sigaction(SIGURG, &action, NULL);                    

    // fcntl
    if (-1 == fcntl (fd, F_SETOWN, getpid() ))
    {
        perror ("F_SETOWN error");
    }

    while(1);
}


程序编译成功,U盘未插入时先运行,出错:
1. open device file error,No media found
2. F_SETOWN error,bad file descriptor。


高手指点一下,我是不是思路压根就错了?或者是某些细节没注意到?
发表于 2007-12-17 14:39:21 | 显示全部楼层
u盘插入以后,才会有设备文件产生.
应该用libdbus,目前的好多应用程序都使用了dbus接口,这样在内核事件发生后就会收到dbusd发送过来的消息。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-12-19 08:54:52 | 显示全部楼层
谢谢了,我去看看。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表