一、Signal小测试
步骤一、编写测试代码
#include <stdio.h>
#include <signal.h>
void my_signal_fun(int signum)
{
static int cnt = 0;
printf("signal = %d, %d times\n", signum, ++cnt);
}
int main(int argc, char **argv)
{
// 绑定用户信号处理回调函数
signal(SIGUSR1, my_signal_fun);
while (1)
{
sleep(1000);
}
return 0;
}
步骤二、编译、拷贝到开发板、在后台运行
编译、拷贝
arm-linux-gcc signal_test.c -o signal-test
sudo cp ./signal-test /kuan/share/
运行
./signal-test &
验证
# 列出当前运行的进程
ps
# 返回可以看到我们后台运行的signal-test,且一直处于休眠状态
uncher
800 0 1308 S ./signal-test
801 0 3096 R ps
步骤三、测试:发送信号给signal-test进程
# 发送用户信号给signal-test进程,其进程号为800
kill -USR1 800
# 可以看到信号处理函数运行并打印出来
Signal Test: 10, 1 times
步骤四、删除signal-test进程
kill -9 800
二、用single实现按键功能
问题
1、注册信号处理函数——应用程序
2、谁发信号——驱动
3、信号发给谁——应用程序
4、怎么发送信号——kill_fasync
驱动代码实现
在笔记【
20210925 按键button 三种方式(查询、中断、poll)】poll中的代码中修改:
步骤一、实现drv_fasync函数
static struct file_operations sencod_drv_fops = {
//。。。
.fasync = _drv_fasync,
};
static struct fasync_struct *_async;
static int _drv_fasync (int fd, struct file *filp, int on)
{
return fasync_helper (fd, filp, on, &_async);
}
步骤二、在按键中断ISR中发送信号
static irqreturn_t buttons_irq(int irq, void *dev_id)
{
//。。。
kill_fasync (&_async, SIGIO, POLL_IN);
return IRQ_RETVAL(IRQ_HANDLED);
}
应用代码实现
int fd = 0;
void my_signal_fun(int signum)
{
unsigned char key;
read(fd, &key, 1);
printf("[KEY]: 0x%02x\n", key);
}
int main(void)
{
printf("Signal Mode!!\n");
signal(SIGIO, my_signal_fun);
fd = open("/dev/button", O_RDWR);
if(fd < 0)
return 1;
fcntl(fd, F_SETOWN, getpid());
int Oflags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, Oflags | FASYNC);
while(1)
{
sleep(1000);
}
return 0;
}