问题标签 [setjmp]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
11251 浏览

c - 使用 longjmp/setjmp 进行 C 错误处理有哪些“好”方法?

我必须将 C 用于一个项目,并且我正在考虑将longjmp/setjmp其用于错误处理,因为我认为在一个中心位置处理错误比返回代码要容易得多。如果有一些关于如何做到这一点的线索,我将不胜感激。

如果发生任何此类错误,我特别关心是否正确完成资源清理。

另外,我如何处理导致多线程程序使用它们的错误?

更好的是,是否已经存在一些用于错误/异常处理的 C 库?

0 投票
2 回答
14022 浏览

c++ - C++:使用 longjmp 和 setjmp 安全吗?

关于以下内容,在 linux/gcc 上的 C++ 中使用 longjmp 和 setjmp 是否安全?

  1. 异常处理(我没有使用 longjmp/setjmp 实现异常处理。我想知道 longjmp/setjmp 会对标准异常处理产生什么副作用)
  2. *this指针
  3. 信号
  4. 智能指针(boost 的共享和侵入式指针)
  5. 还有什么你能想到的。
0 投票
3 回答
1362 浏览

c - pthreads,setjmp,longjmp。如何判断一个函数何时完成运行?

我正在编写一个用户空间线程库。我有一个管理每个线程的结构。我的线程非常简单,它们接受一个函数 ptr 及其参数,然后只运行一次该函数。

每个线程都有一个 jmp_buf,我使用 setjmp 和 longjmp 在线程之间切换。我不知道的一件事是如何判断此功能何时完成。

对于每个线程,我以两种方式修改 jmpbuf。

  1. 我编辑 PC 并将其设置为函数指针,因此程序计数器接下来会转到那里。
  2. 我还让每个人都有自己的堆栈并编辑 SP 使其指向该堆栈

因此,使用我的线程控制结构,我可以在线程之间切换并让每个线程保持状态,但不知道如何判断该功能何时完成。完成后,我想调用我拥有的特殊 exit() 函数。

0 投票
7 回答
5819 浏览

c - 来自信号处理程序的 longjmp()

我正在使用以下代码尝试从用户读取输入并超时并在超过 5 秒后退出。这是通过 setjmp/longjmp 和 SIGALRM 信号的组合来实现的。

这是代码:

现在,我的问题是这个功能是否有任何问题。我读过从信号处理程序调用 longjmp() 可能有未定义的行为,它到底指的是什么?

另外,如果警报在 fgets() 返回之后,但在调用 alarm(0) 之前触发怎么办?即使用户确实输入了某些内容,它是否会导致函数返回 -2?

后期编辑:我对改进代码的方法不感兴趣。我只是想知道它是如何失败的。

0 投票
3 回答
4751 浏览

c - 优秀的 setjmp/longjmp 教程

嗨,我想阅读 C 语言中关于 setjmp/longjmp 的优秀教程。如果有真实的而不是人为的例子会更好。

谢谢。

0 投票
2 回答
10590 浏览

c - Jmp_buf 结构中的每个条目包含什么?

我正在运行 Ubuntu 9.10 (Karmic Koala),我查看了jmp_buf结构,它只是一个 12 个整数的数组。当我使用setjmp, 并传入一个jmp_buf结构时,12 个条目中有 4 个被保存。这 4 个条目是堆栈指针、帧指针、程序计数器和返回地址。其他 8 个条目是做什么用的?它们依赖于机器吗?另一个条目是段表基址寄存器吗?正确恢复线程/进程的环境还需要什么?我查看了手册页和其他来源,但找不到setjmp.

0 投票
4 回答
8149 浏览

c++ - 使用 setjmp 警告 C++ 对象“可能会被破坏”

使用 GCC 4.4.1 编译上述代码 g++ test.cc -Wextra -O1 会给出这个令人困惑的警告:

stl_vector.h 的第 1035 行位于我在构造 foo 时调用的 vector(n, value) 构造函数使用的辅助函数中。如果编译器可以计算出参数值(例如,它是一个数字文字),警告就会消失,所以我在这个测试用例中使用 argc 因为编译器无法确定它的值。

我猜这个警告可能是因为编译器优化了向量构造,所以它实际上发生在 setjmp 着陆点之后(当构造函数参数依赖于函数的参数时,这似乎是这种情况)。

我怎样才能避免这个问题,最好不必将 setjmp 部分分解为另一个函数?

不使用 setjmp 不是一个选项,因为我被一堆需要使用它来处理错误的 C 库所困。

0 投票
1 回答
976 浏览

setjmp - 使用信号处理程序和 setjmp/longjmp 实现抢占式微线程

我想在 Linux 环境中实现符合 POSIX 标准的微线程。基本思路如下:

  1. 使用此处描述的技术,为每根光纤分配新的堆栈空间。
  2. 使用 setitimer,创建将在恒定时间间隔内发送信号的计时器。此计时器的信号处理程序将充当调度程序并在光纤之间切换。

问题是,在信号处理程序中执行 longjmp 不会终止处理程序,因此内核将等待它的终止,而不是传递新信号。这使得切换上下文变得不可能,因为没有信号可以启动切换。一种解决方案是取消阻塞 SIGALRM,这样许多信号可以同时执行处理程序,但这会导致竞争条件问题。

实现抢占式微线程的最佳和最简单的方法是什么?我在谷歌上找到的所有例子都不是先发制人的。

0 投票
2 回答
5067 浏览

c - 我可以撤消或删除 atexit 命令吗?

如果我放在atexit( fn );退出堆栈上,它将在程序退出时执行:从main()或通过返回exit()

我可以从堆栈中删除它吗?

你问我为什么要这样做?

我正在尝试使用atexit,setjmp和的简单 try-catch 机制longjmp。如果可以undo-atexit(fn);的话,那就太完美了——即使它只适用于最后一个注册的函数。

编辑:

按照 monoceres 的建议制作我自己的堆栈...

该堆栈目前仅适用于一个异常捕获器。

0 投票
5 回答
7867 浏览

setjmp - 使用 setjmp、longjmp 进行多任务处理

有没有办法使用setjmplongjmp函数来实现多任务处理