c - setcontext() 中的 Stackoverflow

标签 c multithreading process stack-overflow

下面是我在 Wikipedia 上看到的代码.这会导致堆栈溢出吗?

#include <stdio.h>
#include <ucontext.h>
#include <unistd.h>

int main(int argc, const char *argv[]){
    ucontext_t context;

    getcontext(&context);
    puts("Hello world");
    sleep(1);
    setcontext(&context);
    return 0;
}

原因:当代码到达 setcontext() 时,它会将新帧压入堆栈。由于 setcontext() 没有返回,它被推送的帧将保留在堆栈中。由于程序处于无限循环中,它会继续将新帧插入堆栈,从而导致堆栈溢出。

最佳答案

gdb 另有说明:

(gdb) list
1   #include <stdio.h>
2   #include <ucontext.h>
3   #include <unistd.h>
4   
5   int main(int argc, const char *argv[]){
6       ucontext_t context;
7   
8       getcontext(&context);
9       puts("Hello world");
10      //sleep(1);
(gdb) break 9
Breakpoint 1 at 0x4005bb: file test.c, line 9.
(gdb) run
Starting program: /home/dtarcatu/workspace/ctest/test 

Breakpoint 1, main (argc=1, argv=0x7fffffffe008) at test.c:9
9       puts("Hello world");
(gdb) print $rbp
$1 = (void *) 0x7fffffffdf20
(gdb) print $rsp
$2 = (void *) 0x7fffffffdb60
(gdb) c
Continuing.
Hello world

Breakpoint 1, main (argc=1, argv=0x7fffffffe008) at test.c:9
9       puts("Hello world");
(gdb) print $rbp
$3 = (void *) 0x7fffffffdf20
(gdb) print $rsp
$4 = (void *) 0x7fffffffdb60
(gdb) c
Continuing.
Hello world

Breakpoint 1, main (argc=1, argv=0x7fffffffe008) at test.c:9
9       puts("Hello world");
(gdb) print $rbp
$5 = (void *) 0x7fffffffdf20
(gdb) print $rsp
$6 = (void *) 0x7fffffffdb60

我不熟悉这些上下文处理函数,但似乎 setcontext 不会将新帧推送到堆栈,而是按原样恢复堆栈。所以你只会陷入无限循环 - 没有堆栈溢出......

关于c - setcontext() 中的 Stackoverflow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26420429/

相关文章:

c - 为什么使用 & 为带有 * 的函数传递值?

c - 请帮助我的代码,编译问题

c - 将 rodata 与创建它的函数一起定位

c# - SemaphoreSlim 没有限制任务

c - 如何为同一个父进程创建 4 个子进程并等待 4 个子进程完成?

java - 通知运行在不同对象中的线程

multithreading - 存在竞争条件是否可以接受?

delphi - 使用 Delphi 终止其他机器(通过网络)上正在运行的进程?

c++ - 关于进程和信号的概念问题

启动进程时 Java Android ping IOException "Too many files open"