23,124
社区成员
发帖
与我相关
我的任务
分享
各位前辈,我在linux驱动中实现向应用程序发送一个信号后,应用程序中的sleep会被立即唤醒,请问这是为什么?
应用程序安装信号代码如下:
void axidev_handle(int signum, siginfo_t *info, void *context)
{
}
int main()
{
int fd = open("/dev/axidev", O_RDWR | O_NONBLOCK);
struct sigaction sa;
sigemptyset(&sa.sa_mask);
sa.sa_sigaction = axidev_handle;
sa.sa_flags = SA_RESTART | SA_SIGINFO;
sa.sa_restorer = NULL;
ioctl(fd, IO_SETPID, getpid());
sigaction(SIGUSR1, &sa, NULL);
sleep(200);
return 0;
}
驱动程序发送信号代码如下:
/*
标题:发送信号
参数:
pid
[in] 接收信号的进程ID
signum
[in] 要发送的信号
code
[in] 代码,可任意
返回值:
*/
void axidev_send_signal(int pid, int signum, int code)
{
struct task_struct *task = NULL;
if ( 0 == pid )
return;
struct siginfo info;
info.si_signo = signum;
info.si_errno = 0x0;
info.si_code = code;
info.si_int = 0x8;
rcu_read_lock();
task = pid_task(find_vpid(pid), PIDTYPE_PID);
rcu_read_unlock();
if ( task )
{
send_sig_info(signum, &info, task);
}
}
// 发送信号调用
axidev_send_signal(pDevInfo->pid, SIGUSR1, POLLIN);
// 或
axidev_send_signal(pDevInfo->pid, SIGUSR1, 100);
程序运行平台复旦微045或xilinx zynq 环境