sigaction测试方式求助

唐锡浩
🔖︎ 6 订阅
👍︎ 4 点赞

请问以下不注册处理函数的测试样例合法吗

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <lib.h>

void sigint_handler(int sig) {
debugf("capture SIGINT!!!\n");
exit();
}

int main() {
debugf("Enter sigtst.\n");
kill(0, SIGINT);
debugf("ERROR: SIGINT not handled correctly\n");
while (1) {
;
}
return 0;
}

如果合法的话,那该在什么地方注册信号机制分发函数比较好呢

回复主题帖

MC的大虾1472
👍︎ 1 点赞

个人拙见,有错请骂
测试点是合法的
注册用户自定义的分发函数(调用sigaction函数)应当在kill之前进行(我是参考的题目给出的测试点)

首先您提供的测试点没有把函数给注册到当前进程的sigactions中,所以不会出现capture SIGINT!!!
不过也不应当出现您提供的ERROR字样,因为您实现的SIGINT应默认停止当前进程


唐锡浩 回复 MC的大虾1472
👍︎ 0 点赞

啊啊我的意思是该选择在代码实现的什么地方注册分发函数,而不是每个处理信号的处理函数

我一开始的选择是在kill和sigaction这两个用户态函数里面进行分发函数的注册,但如果既没有sigaction也没有kill的调用,仅仅是内核态下的四个信号的话可能就会发生进程接收信号但是没有分发函数最后panic的状态,这样的panic应该是不可以接受的吧?

这样的情况该怎么合理的处理呢


MC的大虾1472 回复 唐锡浩
👍︎ 0 点赞

你是说sig_entry吗?我认为是可以在sigaction当中进行的,因为系统的所有信号都有自己的默认处理策略,您应当在处理的时候检查是否有指定的策略,如果没有,就是用默认处理策略,我认为使用默认处理策略的时候是不需要进入用户态的sig_entry的,例如如果要停止进程,您可以直接在内核代码中调用env_destroy。而如果已经有处理策略了,那么用户必定至少调用了一次sigaction,也就必定注册了分发函数


唐锡浩 回复 MC的大虾1472
👍︎ 0 点赞

好的,十分感谢,真的对我帮助很大


MC的大虾1472 回复 唐锡浩
👍︎ 2 点赞

最新消息,根据助教的要求:

所有默认处理函数为退出的都使用exit进行处理

然后十分感谢 @陈叙传 同学给予的信息

libmain 函数位于main函数之前

您可以在user/lib/libos的libmain中使用一次注册函数,就可以保证在所有用户代码执行之前,注册上分发函数


唐锡浩 回复 MC的大虾1472
👍︎ 0 点赞

这个巧妙,学到了

0%