- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我试图了解 getcontext/setcontext 在特定情况下是否能正常工作。
我可以看到如何使用 setcontext() 将堆栈展开回历史记录中的某个位置。
#include <stdio.h>
#include <ucontext.h>
int rollback = 0;
ucontext_t context;
void func(void)
{
setcontext(cp);
}
int main(void)
{
getcontext(&context);
if (rollback == 0)
{
printf("getcontext has been called\n");
rollback++;
func();
}
else
{
printf("setcontext has been called\n");
}
}
但我想知道放松后是否可以重新回到 future 的地方?我想这取决于 getcontext()
调用捕获堆栈的副本,我无法在文档中找到确切的详细信息。
#include <stdio.h>
#include <ucontext.h>
int rollback = 0;
int backToFuture = 0;
ucontext_t context;
ucontext_t futureContext;
void func(void)
{
// Some complex calc
if (some-condition)
{
getcontext(&futureContext); // After returning I want to come back
// here to carry on with my work.
if (backToFuture == 0)
{
setcontext(&context); // rewind to get stuff-done
}
}
// Finishe work
}
int main(void)
{
getcontext(&context);
if (rollback == 0)
{
printf("getcontext has been called\n");
rollback++;
func();
// eventually always return here.
}
else
{
printf("setcontext has been called\n");
// Do specialized work that needed to be done
// May involve function calls.
//
// I worry that anything the adds new stack frames
// will disrupt the saved state of futureContext
//
// But without detailed information I can not be sure
// if this is an allowed senario.
backToFuture = 1;
setcontext(&futureContext);
}
}
最佳答案
getcontext
不复制堆栈,它只转储寄存器(包括堆栈指针)和一些上下文数据,如信号掩码等。
当您跳下堆栈时,它会使顶部上下文无效。即使您不会执行任何函数调用,也要考虑可以在那里执行的信号处理程序。如果你想在两个堆栈之间跳转,你需要 makecontext
。
我添加了表明您的代码无效的变量:
void func(void)
{
// Some complex calc
if (1)
{
volatile int neverChange = 1;
getcontext(&futureContext); // After returning I want to come back
// here to carry on with my work.
printf("neverchange = %d\n", neverChange);
if (backToFuture == 0)
{
setcontext(&context); // rewind to get stuff-done
}
}
// Finishe work
}
在我的机器上它导致:
getcontext has been called
neverchange = 1
setcontext has been called
neverchange = 32767
关于c - 使用 getcontext/setcontext 向上/向下切换堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15115480/
我正在尝试使用 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
我是一名优秀的程序员,十分优秀!