目前情况:第四个点17/18(wrong answer),第六个点2/8(sth unexpected happended),遇到两点困惑,求助一下助教和同学:
1. EPC什么情况加4
针对第四个测试点,试过几个版本:
- SIGSYS的EPC不加4:过14个点
- SIGSYS直接加4:过12个点
- SIGSYS只在默认处理函数(忽略)执行后加4:过16个点
- 在3. 的基础上,在出现越界后(内核态)、SIGSEGV信号发出前将EPC加4,过17个点
- 在4. 的基础上,SIGILL也在出现越界后、SIGILL信号发出前将EPC加4,但还是只能过17个点。
想求助一下,以上各步骤的设计是否合理
2. sig相关函数行为
指导书规定了不能阻塞SIGKILL和改变行为,但没有详细约定以下行为,我参考linux manual page进行以下设计:
- sigprocmask不能将SIGKILL位设为1,但是相关尝试仍返回0(成功),只是写入时候去掉SIGKILL对应位上的1:(图片来自man
sigprocmask)
- sigaction中,signum如果是SIGKILL,直接返回-1:(图片来自man
sigaction)
- sigaction中,如果某个信号的屏蔽集之中SIGKILL对应的位为1,在写入进程对应的注册信号的信号屏蔽集sigaction.sa_mask时去掉SIGKILL对应位上的1,但仍返回0(成功注册):(图片来自man
sigaction)
想请教以下助教,以上设计能否满足正确性的约定?
还有我这种错误情况有没有其他错误的可能,求助过来人🙏。
----6/15 再补充两个问题 ----
我的疑问是:
- 如果一类信号被阻塞,然后来了2个该类信号,那我是响应1次还是2次?助教答疑帖说只存在一个实例,又说被阻塞?
1 | #ifdef __x86_64__ |
在Linux上确实响应了1次,就是说第二个kill(0, VICTIM)
消失了,想问一下助教这个机制和课程组要求的是否一致?
- 还有,在从开始响应信号,这个时候取消了相应位的pending,从这时候开始到处理函数返回,同类信号被阻塞,这时候如果又来了一个该类信号,会再将pending置位,等待处理。
但处理结束后,为什么一定要先回到之前的控制流,不能认为注册函数结束后也是判断是否需要响应信号的时机吗?考虑如下程序:
1 | #ifdef __x86_64__ |
linux有如下两种执行情况:
case1: 在handler返回后再次执行handler(无限循环): case2:
不再响应,但是没有回到正常控制流,且异常退出(???):
同样,不知道case1是否符合课程组的要求,想请教一下助教/(ㄒoㄒ)/~~
最后修改于:
最后回复于:
回复主题帖
我过了test 4,但test6一个都没过,我是这样做的:
1
只对sigsys有epc+4,其他的默认处理只有忽略或exit
2
我为了保证sigkill最高的优先级,进行了如下略微抽象的实现:我的实现中sigkill不能设置sigaction,注册会返回成功但实际上没有注册函数;对sigkill的发送和其他信号一样,但只要在发送某个信号时发现pending里已经有sigkill,就不发送这个新信号;在开始进行信号从小到大的选择前进行检查,只要pending里有sigkill,就将pending设为只有sigkill,并直接选择sigkill作为要处理的信号,直接处理
最后修改于:2024-06-14 20:59:06
发现大家都是把SIGKILL和其他的信号一样进行处理,不知道有没有人这样做:
在kill函数当中,如果发现信号是SIGKILL,直接获取对应的env并且destroy?
最后修改于:2024-06-16 12:44:09
这样可能会忽略exit函数中终止进程前的其他处理,不过问题应该不大
最后修改于:2024-06-16 12:49:29
我查看了一下助教发布的问题集合
对于默认终止进程的处理函数,规定都使用exit退出进程。
不知道大大是怎么做到在用户注册sig_entry
之前就让用户能跳转到exit
的位置?(我的sig_entry
只有在用户一次调用sigaction
之后才会注册上)
最后修改于:2024-06-16 12:58:57
exit是在sig_entry里调用的;sig_entry是在libos的libmain里注册的,位于进入main之前
最后修改于:2024-06-16 13:05:05
回复主题帖
对于sigkill的设计是正确的。
“Linux只响应了一次”和课程组的要求一致。
case1是正确的。
最后修改于:2024-06-16 13:35:38
回复主题帖
note: SIGSEGV的EPC不用加4,但是也要照常分配物理页面
最后修改于:2024-06-17 16:34:19