- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
背景
在我的 C++ 程序中,我有一个 SIGALRM 处理程序,我想在其中通过抛出将信号转换为异常(我知道这通常不是好的做法,但在我正在处理的系统中,它可能是唯一选择)。我的问题是,当我们执行 malloc 时,可以调用 SIGALRM 处理程序,而 throw 将调用执行另一个 malloc 的 __cxa_allocate_exception。这两个 malloc 调用可能会在 glibc 2.12 中陷入僵局。我尝试预先分配异常,但对 __cxa_allocate_exception 的调用仍然发生。我检查了 gcc 的源代码,似乎没有任何条件可以调用 __cxa_allocate_exception。
其他背景
我在 try block 之前安装信号处理程序,并在 catch 之后卸载它。我从信号处理程序中抛出,这样我认为它会在 try block 内(我们不考虑在 catch 逻辑中接收到信号的情况)并且可以被正确捕获。
我想我遇到了此处描述的 malloc 死锁:https://sourceware.org/bugzilla/show_bug.cgi?id=13699在这里 https://sourceware.org/ml/libc-alpha/2012-02/msg00272.html .
问题
我的问题是:我是否可以阻止 throw 调用 malloc? (另外,我明白我在做malloc的时候可以屏蔽掉SIGALRM信号,但是怕屏蔽的地方太多)。
提前致谢。非常感谢任何帮助/引用。
最佳答案
一般的问题是,如果你的信号处理程序在任何异步不安全的库函数(例如 malloc 或 printf)中被调用,跳出信号处理程序(通过 longjmp 或异常)可能会使 glibc 处于不一致的状态状态,下次您调用任何东西时它会崩溃或以其他方式出现异常。
因此,即使您能够避免在异常设置中调用 malloc,并抛出异常并捕获并处理它,您的程序在下次调用 malloc 时仍然会崩溃。
避免这种情况的唯一方法是确保在异步不安全的库函数中不能调用信号处理程序。您可以通过使用 sigblock
来阻止和取消阻止每次调用程序中任何地方的信号不安全函数时的信号:
oldmask = sigblock(SIGALRM);
...call to malloc or printf or whatever...
setsetmask(oldmask);
这是可能的,但不太实用。
关于c++ - 无论如何我可以阻止 throw 调用 malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37425944/
我想制作一个主要功能取决于发送短信的应用程序。在我开发 android(native) 之前,但现在我使用 React-Native 使其适用于 IOS 和 Android。 在android中,如果
我想重新运行一个测试类,包括它的 @BeforeMethod当其中任何一个是 @Test失败。我已经实现了 TestNG 重试逻辑来重新运行失败的测试用例,但我想运行整个类。 最佳答案 可以这样做。
前几天我遇到了一个接线员,-),而我找到的一个名称“arrow application”通常链接到 the other kind of Arrow present in Haskell ,这似乎无关。
我希望能够在我的sql语句中获取记录的ID: $result = $db->query("select id,FQDN, ip_address, ....."); 但是,我不希望它使用标题显示在导出中
我刚刚在Windows XP中激活了主题(通常使用经典的Win9x外观进行工作),并且看到两个面板是纯黑色的。其他面板也可以(颜色= clBtnFace)。 这两个面板的共同点是它们的父面板。两者都直
我正在研究使用数据库存储到该数据库条目的生成的链接,该链接包含有关该数据库条目的更多信息。因此,您会看到一些数据库,然后单击该条目并打开一个新页面,其中包含有关该条目的更多信息。 我一直在寻找一种可以
这里有几篇与此主题相关的帖子,但我已经应用了与我读到的所有内容相关的内容: CSS .infoWindow { width: 90px; height: 90px; } 创建信息窗口并
我目前正在编写使用sqlite3的脚本。最近,由于我的代码因错误而提前退出,我遇到了另一个程序正在使用该数据库的问题。 遇到类似问题,通常使用: conn = sqlite3.connect(...)
我只想在Redis数据库中使用1个键值对。并且该值将每60秒减少1。可能吗? 最佳答案 一个有趣的问题:)是的,您可以花一些技巧。 众所周知,Redis TTL会随着时间自动降低。因此,您可以将TTL
我尝试了数十种不同的方式来播放来自YouTube或服务器的视频,而没有使其进入全屏模式。我知道这是有可能的,因为YouTube应用程序允许这种情况发生,但似乎无法弄清楚该怎么做。请指教! 最佳答案 看
是否有办法在jade文件或其他模板引擎中编写服务器端nodejs代码(如down代码)? (或没有模板引擎): extends layout block content p Welcome to
Closed. This question needs to be more focused。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅关注editing this post的一个问题。
您好,我最近下载并打开了适用于everyplay android的unity软件包,想知道我是否还能抓取玩游戏的用户上传到youtube的视频的URL?看来,实际共享功能的大部分代码是外部的,我看不到
我正在尝试在 Google 表单的网址中传递查询参数,并将该表单提交给其他人来填写,因此我希望 onSubmit 事件检查该查询参数并获取它。 我的 onSubmit 事件有以下代码: functio
我有一个这样的功能,我想将单元格放在网格列的左侧和右侧,现在它只是一个一个地放置,对于左侧网格列,它应该是 ,对于正确的,可以是 ,有没有根据索引区别对待,如果是奇数则属于左Grid Column
我有以下索引模板 { "index_patterns": "notificationtiles*", "order": 1, "version": 1, "aliases": {
我有一个Docker容器,该容器将具有大量(大约100个)自定义设置。与将默认值全部编码到DockerFile中相比,我希望具有更大的灵活性。我注意到docker run命令支持此选项: --env-
我有一个带有指针的谷歌地图。我已经对其进行了设置,因此每当缩放发生变化或视口(viewport)发生变化时,它都会相应地加载一组新的指针: google.maps.event.addListener(
我有一个php容器,每次启动容器时都需要启动php-fpm。现在,由于php-fpm config文件中的配置错误,fpm无法启动,因此,容器无法启动。无论如何,我可以在没有php-fpm的情况下启动
我正在运行没有sudo访问权限的docker容器 docker run -it --user 739000:8500 blabla... 无论如何,我可以在没有sudo访问的情况下在此docker容器
我是一名优秀的程序员,十分优秀!