- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 SA_SIGINFO sigaction
的第三个参数直接跳转到中断的上下文。
这么想的:
void action(int Sig, siginfo_t *Info, void *Uctx) {
ucontext_t *uc = Uctx; setcontext(uc);
}
将具有与以下相同的效果:
void action(int Sig, siginfo_t *Info, void *Uctx) {
return;
}
但奇怪的是它接受三个信号(调用 setcontext-calling 处理程序),然后它出现段错误
setcontext
:
Dump of assembler code for function setcontext:
0x00007ffff7a34180 <+0>: push %rdi
0x00007ffff7a34181 <+1>: lea 0x128(%rdi),%rsi
0x00007ffff7a34188 <+8>: xor %edx,%edx
0x00007ffff7a3418a <+10>: mov $0x2,%edi
0x00007ffff7a3418f <+15>: mov $0x8,%r10d
0x00007ffff7a34195 <+21>: mov $0xe,%eax
0x00007ffff7a3419a <+26>: syscall
0x00007ffff7a3419c <+28>: pop %rdi
0x00007ffff7a3419d <+29>: cmp $0xfffffffffffff001,%rax
0x00007ffff7a341a3 <+35>: jae 0x7ffff7a34200 <setcontext+128>
0x00007ffff7a341a5 <+37>: mov 0xe0(%rdi),%rcx
--Type <RET> for more, q to quit, c to continue without paging--
0x00007ffff7a341ac <+44>: fldenv (%rcx)
=> 0x00007ffff7a341ae <+46>: ldmxcsr 0x1c0(%rdi)
0x00007ffff7a341b5 <+53>: mov 0xa0(%rdi),%rsp
0x00007ffff7a341bc <+60>: mov 0x80(%rdi),%rbx
并且 strace 显示的故障地址为 0(可捕获的 SIGSEGV)。
#include <unistd.h>
#include <sys/time.h>
#include <ucontext.h>
#include <signal.h>
void action(int Sig, siginfo_t *Info, void *Uctx) {
ucontext_t *uc = Uctx; setcontext(uc);
}
int main(void) {
char ch[100];
sigaction(SIGALRM, &(struct sigaction){.sa_sigaction = action, .sa_flags = SA_SIGINFO}, 0);
setitimer(ITIMER_REAL, &(struct itimerval){.it_interval.tv_sec = 1,.it_value.tv_sec = 1}, 0);
write(1, "enter\n", 6);
for (;;) {
write(1, "{\n", 2);
read(0, &ch[0], sizeof(ch));
write(1, "}\n", 2);
}
}
在这种情况下发生了什么?
最佳答案
我认为这根本不适合工作:您应该只拨打 setcontext
使用从 getcontext
获得的上下文或 makecontext
,而不是传递给信号处理程序的上下文。
The man page暗示这一点:
If the context was obtained by a call to a signal handler, then old standard text says that "program execution continues with the program instruction following the instruction interrupted by the signal". However, this sentence was removed in SUSv2, and the present verdict is "the result is unspecified".
setcontext
有一个评论:
This implementation is intended to be used for synchronous contextswitches only. Therefore, it does not have to restore anythingother than the PRESERVED state.
rax
清零。 (至于
getcontext
返回 0)。这对于尝试恢复不期望其寄存器自发改变的代码来说是非常糟糕的。
getcontext/setcontext
日期来自更早的时代,实际上已经从 POSIX 规范中删除,前提是应该使用 pthreads 来代替。
struct ucontext_t
的内核布局之间的不匹配引起的。 ,以及 libc 所期望的。特别是,libc 期望浮点状态,包括
mxcsr
的保存值。 , 在
struct ucontext_t
内的特定偏移量处.然而,内核将浮点状态推送到堆栈上的一个单独位置(恰好与 libc 期望的位置重叠),并在
struct ucontext_t
中包含一个指向它的指针。 .所以libc的
setcontext
尝试将一些垃圾值加载到
mxcsr
,其中设置了一些保留位 16-31,这会导致一般保护故障。
关于c - 通过 setcontext 从信号处理程序返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69237910/
我正在尝试使用 C 中的上下文切换创建自定义 pthread 库。我在调用 setcontext() 时遇到了出现段错误的问题 - 关于此函数的文档似乎有限,所以我可以'我真的不知道发生了什么,这已经
我正在做一些关于调度程序如何安排等待线程的测试,在这个过程中,我不想让操作系统看到等待线程,所以我杀死了一个正在等待锁的线程并在锁被释放,我想我应该在退出前保存线程的上下文,并在我再次创建它时恢复它。
我正在尝试使用 SA_SIGINFO sigaction 的第三个参数直接跳转到中断的上下文。 这么想的: void action(int Sig, siginfo_t *Info, void *Uc
下面是我在 Wikipedia 上看到的代码.这会导致堆栈溢出吗? #include #include #include int main(int argc, const char *argv[
我遇到了 SecurityContextHolder.getContext().getAuthentication() 的问题,它是 null。我尝试了很多与注释和示例的组合。 (来自站点的代码在我的
我正在编写一些代码,需要我手动操作一段代码的上下文,然后切换到它,而不是使用 makecontext。由于断言失败,我的测试程序在一行上失败,所以我尝试使用 GDB 来确定结果并查看该部分失败的原因,
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 6 年前。 Improve t
在another question我在移植代码时遇到了问题: unsigned long stack[] = { 1, 23, 33, 43 }; /* save all the registers
我正在尝试复制一个线程的上下文,包括堆栈以创建一个检查点,稍后我可以恢复它。出于这个原因,我试图将 getcontext 和 setcontext 的调用移动到一个也保存堆栈的函数中,但这行不通。 来
我试图了解 getcontext/setcontext 在特定情况下是否能正常工作。 我可以看到如何使用 setcontext() 将堆栈展开回历史记录中的某个位置。 #include #inclu
在 node.js 中,我们可以使用 agent.setContext() 设置上下文,python 将使用这种方式的替代方案是什么? 目前我正在使用下面的代码来设置新的上下文: res = {
这是一个简单的示例: import Button from './Button.svelte'; let text = 'Click me!'; let sayHello =
int swapcontext(ucontext_t *oucp, ucontext_t *ucp); int getcontext(ucontext_t *ucp); int setcontext(
本文整理了Java中org.apache.commons.jelly.parser.XMLParser.setContext()方法的一些代码示例,展示了XMLParser.setContext()的
本文整理了Java中com.koolearn.klibrary.text.view.ZLTextView.setContext()方法的一些代码示例,展示了ZLTextView.setContext(
v2 API 中 v1 中的 dialogflow 的 app.setContext() 的等价物是什么?考虑到迁移指南概述的设置(如下),当在下面的演示代码中触发欢迎意图时,您会调用什么方法来设置上
我一直在使用 header 对 Apollo Client 进行身份验证。以下工作正常: const middlewareAuthLink = new ApolloLink((operation, f
在我的一个测试类(class)中,我使用: //Make a security context SecurityContext securityContext = mock( SecurityCont
我们需要实现一个线程库。但我真的无法解决这个 yield() 函数......所以在 yield() 中,我们需要将当前线程推到就绪线程队列的末尾,并将第一个线程弹出并执行它。(FIFO)我使用的是
所以我试图将授权 header 传递给 Apollo Client 3 以访问数据库。在当前文档中推荐的方法是创建一个 HttpLink 对象 const httpLink = new HttpLin
我是一名优秀的程序员,十分优秀!