|
我自己的一个应用程序,其中需要对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。
高手指点一下,我是不是思路压根就错了?或者是某些细节没注意到? |
|