【问题标题】:How does swapcontext and getcontext work?swapcontext 和 getcontext 是如何工作的?
【发布时间】:2020-04-10 20:21:51
【问题描述】:

我下面有这段代码

volatile int done = 0;

int main() {


ucontext_t one;
ucontext_t two;


getcontext(&one);
printf("done = %d\n", done);
if(!done) {
done = 1;
printf(" - gurka -\n");
swapcontext(&two, &one);
printf(" - tomat -\n");
} else {
printf(" - salad -\n");
swapcontext(&one, &two);
printf(" - morot -\n");
}
printf(" - potät -\n");
return 0;
}

当它执行后,我在下面得到这个

done = 0
- gurka -
done = 1
- salad -
- tomat -
- potät -

为什么它会像这样打印出来我有这个函数 swapcontext() 并且在手册页中它是这样写的,它将上下文保存在另一个线程中我不明白为什么它会写出这个?

【问题讨论】:

  • 您好,您应该在 C 中测试这个吗?
  • “POSIX.1-2008 删除了 getcontext() 规范,理由是可移植性问题,并建议重写应用程序以改用 POSIX 线程。”

标签: c operating-system


【解决方案1】:

int swapcontext(ucontext_t *oucp, ucontext_t *ucp);

swapcontext() 函数将当前上下文保存在结构中 oucp指向的,然后激活ucp指向的上下文。

“上下文”一词,是指代表系统当前状态的所有重要处理器寄存器。这些寄存器列表取决于您的机器架构,但最重要的是:堆栈指针、程序计数器、链接寄存器(对于 ARM、PowerPC 和保存返回地址的 PA-RISC)等。 这些寄存器将存储到oucp。此外,由于设置了 PC 值,将从 ucp 加载每个激活上下文,它可能会跳转。

所以,根据你的代码:

1 |volatile int done = 0;
2 |
3 |int main() {
4 |
5 |
6 | ucontext_t one;
7 | ucontext_t two;
8 |
9 |
10| getcontext(&one);
11| printf("done = %d\n", done);
12| if(!done) {
13|     done = 1;
14|     printf(" - gurka -\n");
15|     swapcontext(&two, &one);
16|     printf(" - tomat -\n");
17| } else {
18|     printf(" - salad -\n");
19|     swapcontext(&one, &two);
20|     printf(" - morot -\n");
21| }
22| printf(" - potät -\n");
23| return 0;
24|}

在第 #15 行,one 上下文将被加载。代码将跳转到第 11 行。

在第 19 行,two 上下文将被加载。代码将跳转到第 16 行。

请注意,getcontext 只是保存当前上下文。 您可以通过谷歌搜索在网络上获得有关这些类型功能的更多详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 2017-07-24
    • 1970-01-01
    • 2011-08-14
    • 2018-11-10
    • 2018-02-12
    • 2018-06-21
    相关资源
    最近更新 更多