SIGUSR1使用的问题
我是要做个内核对用户的异步通知,在网上找了一下相关资料,照着写了一下发现一个奇怪的问题,在用户态这边把信号类型定义为SIGUSR1就会出错,定义为SIGIO就不会,
而且无论我在内核发送哪个SIG,用户这边永远收到的是SIGIO,代码如下:
用户:
static sem_t app_mutex;
void signal_handle(int signalnum)
{
sem_wait(&app_mutex);
printf("receive %d signal!\n",signalnum);//只要能收到信号,永远是SIGIO
sem_post(&app_mutex);
}
int main(void)
{
int fd,oflags;
int error = 0;
sem_init(&app_mutex,0,1);
fd = open("/dev/ts0",O_RDWR,S_IRUSR|S_IWUSR);
printf("open file fd = %d\n",fd);
if(fd != -1)
{
//signal(SIGUSR1,signal_handle);//只打开SIGUSR1就会报错退出
signal(SIGIO,signal_handle);//打开他就会收到信号
error = fcntl(fd,F_SETOWN,getpid());
printf("error = %d,fd = %d,pid =%d,SIGIO = %d\n",error,fd,getpid(),SIGUSR1);
oflags = fcntl(fd,F_GETFL);
error = fcntl(fd,F_SETFL,oflags|FASYNC);
printf("error = %d fd = %d oflags %#x \n",error,fd,(oflags|FASYNC));
while(1)
{
sleep(1);
//printf("app run\n");
}
}
else
{
printf("open file error\n");
}
return 0;
}
内核:
static int ts_file_fasync(int fd,struct file *filp,int mode)
{
struct ts_dev *dev = filp->private_data;
int error_code;
/*add file to async list*/
error_code = fasync_helper(fd,filp,mode,&(dev->async_queue));
return error_code;
}
void ts_mode_change_callback(void)
{
struct ts_dev *dev = platform_get_drvdata(&ts_device);
if((dev->async_queue != NULL)&&(dev != NULL))
{
/*sent signal to app*/
kill_fasync(&dev->async_queue,SIGUSR1,POLL_IN);//这里发送信号
}
}
//这是一个线程循环发信号
int signal_sent_task(void *ts_dev)
{
while(1)
{
schedule_timeout(100000);
ts_mode_change_callback();
schedule_timeout(100000);
}
return 0;
} 有没有人懂啊.
页:
[1]