- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我仍然有点困惑,为什么从该信号处理程序中接收信号并调用非异步安全函数是不安全的。有人可以解释这背后的原因,并可能尝试给我一些引用资料,我可以按照这些引用资料自己阅读更多内容吗?
换句话说,我在问为什么在信号处理程序中调用 printf 是不安全的。是因为进程内问题和可能的竞争条件是由于两次可能的 printf 调用而导致的可能没有保护,还是因为进程间竞争相同的资源(在本例中为标准输出)。假设进程 A 中的一个线程正在调用 printf,另一个线程接收到信号然后调用 printf。是否可能是因为这里的内核将不知道要做什么,因为它将无法区分这两个调用。
最佳答案
Say a thread within process A is calling printf and another threadreceives the signal and then calls printf. Is it possibly because thekernel here will not know what to do because it will not be able todistinguish between the two calls.
printf
不是核函数。它是您的应用程序使用的 C 库中的一个函数。
printf
实际上是一个相当复杂的函数。它支持多种输出格式。
stdout
文件句柄的输出缓冲区。每当某些定义的条件发生时,即当输出缓冲区已满和/或每当一个换行符被写入时,输出缓冲区就会被刷新(并且仅在此时内核接管并将定义的数据块写入文件)输出流。
printf
做它的工作。我的意思是,在任何时候。它很可能到达同时
printf
正在更新输出缓冲区的内部数据结构,并且它们处于暂时不一致的状态,因为
printf
还没更新完呢。
printf
可能不是信号安全的,但它是线程安全的。多线程可以使用
printf
写入标准输出。线程有责任在它们之间协调这个过程,以确保最终输出实际上是有意义的,并且它不会从多个线程的输出中随机困惑,但这不是重点。
printf
是线程安全的,这通常意味着某处有
mutex参与的过程。因此,可能发生的事件序列是:
printf
获取内部互斥锁。printf
继续格式化字符串并将其写入 stdout
的输出缓冲区。printf
完成,可以释放获取到的互斥锁,一个信号到达。mutex
锁住了。关于信号处理程序的事情是通常没有指定进程中的哪个线程来处理信号。一个给定的实现可能会随机选择一个线程,或者它可能总是选择当前正在运行的线程。无论如何,它肯定可以挑出锁定
printf
的线程。 ,这里是为了处理信号。
printf
.因为
printf
的内部互斥锁被锁定,线程必须等待互斥锁解锁。
printf
可能会使用 C++ 等效的
std::recursive_mutex
, 以避免这个问题,但即使这样也不能解决所有可能由信号引入的死锁。
关于c++ - 为什么只能从信号处理程序安全地调用异步信号安全函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34467694/
在我的 java 代码中,我做了类似的事情: int sleep = 0; sleep(sleep); sleep++; 被bos指出不好。它不能在 php 中正常工作。 在 java 中使用上述代码
我有一个程序使用第 3 方库进行一些计算,我在与主应用程序不同的线程上启动该程序。不幸的是,此计算可能需要很长时间,并且不提供进度更新和取消的接口(interface)。 为了拥有这样的界面,我想创建
C++ 是否有任何等效于 python 的函数 os.path.join?基本上,我正在寻找将文件路径的两个(或多个)部分组合在一起的东西,这样您就不必担心确保这两个部分完美地结合在一起。如果它在 Q
我正试图站起来(非商业)web application使用 neo4j Community 3.5.2 作为后端。 应用程序以两种方式与图形交互: 服务器端(安全的)用 flask 编写新的节点和关系
我正在开发一个将有许多外部用户的在线应用程序。至于现在,我的连接方法是为所有用户托管一个中央数据库,而他们从自己的服务器文件连接。 方法: PHP 连接文件(托管在他们的服务器上;文件由我提供) >>
我创建了一个将所有事件通知代码转换为字符串的函数。真的很简单。 我有一堆常量,比如 const _bstr_t DIRECTSHOW_MSG_EC_ACTIVATE("A video window i
我想将(附加)信息从过滤器传递到资源。我目前尝试这样做的方式是,在 Filter 中: getContext().getAttributes().put("additionalInformation"
我想计算转换系数。为此,我必须除以例如的最大值。 ushort 为 uchar 的最大值。 我想通过将参数传递给函数或类型名来动态地执行此操作。然后我想选择最大值并执行计算。 有两个问题: 如何动态选
我希望我的用户在用 Java 请求列表时能够编写自己的过滤器。 选项 1) 我正在考虑将 JavaScript 与 Rhino 结合使用。 我将用户的过滤器作为 javascript 字符串获取。然后
(安全地)提供来自不同域的图像是否符合 PCI 标准?我搜索了 PCI DSS 2.0 PDF,但没有找到任何引用资料。 最佳答案 图像不符合 PCI 合规性。 PCI DSS covers the
我们正在将 spring 和 hibernate 用于 web 应用程序:该应用程序有一个购物车,用户可以在其中放置商品。为了保存不同登录名之间要查看的项目,购物车中的项目值存储在表中。提交购物车时,
我正在为多个客户创建一个具有电子商务元素的 Rails 应用程序 - 我希望这些客户能够在管理区域中指定计算运费的公式;因为方法可能不同。 让我们假装一下,我允许他们输入 ruby 代码,然后我稍
我正在 Eclipse 中开发一个 Java 项目,使用 Maven 构建和管理依赖项。该项目分布在 5 个 Eclipse 项目中,其中一个是父 POM。我正在研究基于另一个团队实现的更复杂服务器的
我想在 ADO.NET 数据服务中存储每线程数据。在线程特定的静态变量上使用 ThreadStatic 属性是否安全,或者我会遇到问题吗?我担心的是,我的 ThreadStatic 变量在请求完成并且
Stackoverflow 上至少有一篇与此主题相关的帖子:Generate password in python 你会发现这个主题甚至在 PEP 中也受到了一些批评。这里提到:https://www
对于我工作中的一个项目,我需要创建一个独立的 Python 安装(来自源代码)。然而,完整的目录占用大约 90MB 的磁盘空间,虽然不多,但太多了,无法一遍又一遍地复制。 我可以从自定义 python
例如,我有一张学生表,我有一本 Python 字典 mydict = {"fname" : "samwise", "lname" : "gamgee", "age" : 13} 我怎样才能安全地生成一
我经常在代码中遇到使用 memset 手动零初始化的 POD 结构,如下所示: struct foo; memset(&foo, 0, sizeof(foo)); 我检查了 C++11 标准,它说:“
我是一名优秀的程序员,十分优秀!