问题标签 [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.
c - 使用 longjmp/setjmp 进行 C 错误处理有哪些“好”方法?
我必须将 C 用于一个项目,并且我正在考虑将longjmp/setjmp
其用于错误处理,因为我认为在一个中心位置处理错误比返回代码要容易得多。如果有一些关于如何做到这一点的线索,我将不胜感激。
如果发生任何此类错误,我特别关心是否正确完成资源清理。
另外,我如何处理导致多线程程序使用它们的错误?
更好的是,是否已经存在一些用于错误/异常处理的 C 库?
c++ - C++:使用 longjmp 和 setjmp 安全吗?
关于以下内容,在 linux/gcc 上的 C++ 中使用 longjmp 和 setjmp 是否安全?
- 异常处理(我没有使用 longjmp/setjmp 实现异常处理。我想知道 longjmp/setjmp 会对标准异常处理产生什么副作用)
*this
指针- 信号
- 智能指针(boost 的共享和侵入式指针)
- 还有什么你能想到的。
c - pthreads,setjmp,longjmp。如何判断一个函数何时完成运行?
我正在编写一个用户空间线程库。我有一个管理每个线程的结构。我的线程非常简单,它们接受一个函数 ptr 及其参数,然后只运行一次该函数。
每个线程都有一个 jmp_buf,我使用 setjmp 和 longjmp 在线程之间切换。我不知道的一件事是如何判断此功能何时完成。
对于每个线程,我以两种方式修改 jmpbuf。
- 我编辑 PC 并将其设置为函数指针,因此程序计数器接下来会转到那里。
- 我还让每个人都有自己的堆栈并编辑 SP 使其指向该堆栈
因此,使用我的线程控制结构,我可以在线程之间切换并让每个线程保持状态,但不知道如何判断该功能何时完成。完成后,我想调用我拥有的特殊 exit() 函数。
c - 来自信号处理程序的 longjmp()
我正在使用以下代码尝试从用户读取输入并超时并在超过 5 秒后退出。这是通过 setjmp/longjmp 和 SIGALRM 信号的组合来实现的。
这是代码:
现在,我的问题是这个功能是否有任何问题。我读过从信号处理程序调用 longjmp() 可能有未定义的行为,它到底指的是什么?
另外,如果警报在 fgets() 返回之后,但在调用 alarm(0) 之前触发怎么办?即使用户确实输入了某些内容,它是否会导致函数返回 -2?
后期编辑:我对改进代码的方法不感兴趣。我只是想知道它是如何失败的。
c - 优秀的 setjmp/longjmp 教程
嗨,我想阅读 C 语言中关于 setjmp/longjmp 的优秀教程。如果有真实的而不是人为的例子会更好。
谢谢。
c - Jmp_buf 结构中的每个条目包含什么?
我正在运行 Ubuntu 9.10 (Karmic Koala),我查看了jmp_buf
结构,它只是一个 12 个整数的数组。当我使用setjmp
, 并传入一个jmp_buf
结构时,12 个条目中有 4 个被保存。这 4 个条目是堆栈指针、帧指针、程序计数器和返回地址。其他 8 个条目是做什么用的?它们依赖于机器吗?另一个条目是段表基址寄存器吗?正确恢复线程/进程的环境还需要什么?我查看了手册页和其他来源,但找不到setjmp
.
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 库所困。
setjmp - 使用信号处理程序和 setjmp/longjmp 实现抢占式微线程
我想在 Linux 环境中实现符合 POSIX 标准的微线程。基本思路如下:
- 使用此处描述的技术,为每根光纤分配新的堆栈空间。
- 使用 setitimer,创建将在恒定时间间隔内发送信号的计时器。此计时器的信号处理程序将充当调度程序并在光纤之间切换。
问题是,在信号处理程序中执行 longjmp 不会终止处理程序,因此内核将等待它的终止,而不是传递新信号。这使得切换上下文变得不可能,因为没有信号可以启动切换。一种解决方案是取消阻塞 SIGALRM,这样许多信号可以同时执行处理程序,但这会导致竞争条件问题。
实现抢占式微线程的最佳和最简单的方法是什么?我在谷歌上找到的所有例子都不是先发制人的。
c - 我可以撤消或删除 atexit 命令吗?
如果我放在atexit( fn );
退出堆栈上,它将在程序退出时执行:从main()
或通过返回exit()
。
我可以从堆栈中删除它吗?
你问我为什么要这样做?
我正在尝试使用atexit
,setjmp
和的简单 try-catch 机制longjmp
。如果可以undo-atexit(fn);
的话,那就太完美了——即使它只适用于最后一个注册的函数。
编辑:
按照 monoceres 的建议制作我自己的堆栈...
该堆栈目前仅适用于一个异常捕获器。
setjmp - 使用 setjmp、longjmp 进行多任务处理
有没有办法使用setjmp
和longjmp
函数来实现多任务处理