我写过一个使用SIGALRM
和信号处理程序的程序。内核空间中的信号处理
我现在试图添加这个作为内核的测试模块。
我发现我必须替换很多libc提供的函数以及它们的底层系统调用...例如timer_create
和sys_timer_create
timer_settime
和sys_timer_settime
等等。
但是,我遇到sigaction
问题。
编译内核引发以下错误
arch/arm/mach-vexpress/cpufreq_test.c:157:2: error: implicit declaration of function 'sys_sigaction' [-Werror=implicit-function-declaration]
我已经把它贴在下面
int estimate_from_cycles() {
timer_t timer;
struct itimerspec old;
struct sigaction sig_action;
struct sigevent sig_event;
sigset_t sig_mask;
memset(&sig_action, 0, sizeof(struct sigaction));
sig_action.sa_handler = alarm_handler;
sigemptyset(&sig_action.sa_mask);
VERBOSE("Blocking signal %d\n", SIGALRM);
sigemptyset(&sig_mask);
sigaddset(&sig_mask, SIGALRM);
if(sys_sigaction(SIGALRM, &sig_action, NULL)) {
ERROR("Could not assign sigaction\n");
return -1;
}
if (sigprocmask(SIG_SETMASK, &sig_mask, NULL) == -1) {
ERROR("sigprocmask failed\n");
return -1;
}
memset (&sig_event, 0, sizeof (struct sigevent));
sig_event.sigev_notify = SIGEV_SIGNAL;
sig_event.sigev_signo = SIGALRM;
sig_event.sigev_value.sival_ptr = &timer;
if (sys_timer_create(CLOCK_PROCESS_CPUTIME_ID, &sig_event, &timer)) {
ERROR("Could not create timer\n");
return -1;
}
if (sigprocmask(SIG_UNBLOCK, &sig_mask, NULL) == -1) {
ERROR("sigprocmask unblock failed\n");
return -1;
}
cycles = 0;
VERBOSE("Entering main loop\n");
if(sys_timer_settime(timer, 0, &time_period, &old)) {
ERROR("Could not set timer\n");
return -1;
}
while(1) {
ADD(CYCLES_REGISTER, 1);
}
return 0;
}
相关的代码块是接受用户空间代码,并单独改变足以运行调用这种方法内核空间中的代码?
不,不是真的。内核模块必须运行的环境与用户级程序运行的环境大不相同,可调用的某些函数的名称只是一个相当大的冰山的一角... – twalberg
什么是在内核空间中执行信号处理/警报的正确方法呢? –
我不这么认为。你能举一个例子说明如何发送信号给内核? –