linux 信号 进程死锁,linux信号处理程序中的malloc导致死锁(malloc inside linux signal handler cause deadlock)...

linux信号处理程序中的malloc导致死锁(malloc inside linux signal handler cause deadlock)

首先对于在信号处理程序中调用malloc感到抱歉:)我也明白我们不应该在信号处理程序中做任何耗时的任务/这种讨厌的东西。

但我很想知道它坠毁的原因吗?

#0 0x00006e3ff2b60dce in _lll_lock_wait_private () from /lib64/libc.so.6

#1 0x00006e3ff2aec138 in _L_lock_9164 () from /lib64/libc.so.6

#2 0x00006e3ff2ae9a32 in malloc () from /lib64/libc.so.6

#3 0x00006e3ff1f691ad in ?? () from ..

操作系统:RHEL

First of all sorry for calling malloc inside signal handler :).I too understand we should not do any time consuming task/this kind of nasty stuff inside signal handler.

But i am curious to know the reason why it is crashed ?

#0 0x00006e3ff2b60dce in _lll_lock_wait_private () from /lib64/libc.so.6

#1 0x00006e3ff2aec138 in _L_lock_9164 () from /lib64/libc.so.6

#2 0x00006e3ff2ae9a32 in malloc () from /lib64/libc.so.6

#3 0x00006e3ff1f691ad in ?? () from ..

operating system : RHEL

原文:https://stackoverflow.com/questions/40049751

2020-01-14 01:51

满意答案

malloc()不是一个可以从信号处理程序安全地调用的函数。 这不是一个异步信号安全功能。 所以,你不应该从信号处理程序调用malloc()。 您只能从信号处理程序中调用一组有限的函数。 查看man信号 ,查看可以从信号处理程序中安全调用的函数列表。

看着你的GDB输出,看起来虽然malloc()持有一个锁,但你再次调用malloc()会导致死锁。

malloc() is not a function that can be safely called from a signal handler. It's not a async-signal-safe function. So, you should never call malloc() from a signal handler. You are only allowed to call a limited set of functons from a signal handler. See the man signal-safety for the list of functions you can safely call from a signal handler.

Looking at your GDB output, it appears that while malloc() is holding a lock, you are calling malloc() again which results in a deadlock.

2018-12-27

相关问答

是的,信号处理程序的执行本身可能会由于传送另一个信号而中断。 然而,有一些细微之处。 默认情况下,用户定义的信号处理程序暂时阻止调用它们的信号。 除非设置了SA_NODEFER标志,否则这是sigaction的默认行为。 (至少在大多数实现中,这也是较老的,不鼓励signal功能的行为)。 此外,通过设置const struct sigaction的sa_mask成员, sigaction可以在处理程序执行期间显式地阻止信号。 你看到的大多数代码都会在结构体初始化时显式清空这个成员,尽管它对sig...

愚蠢的错误。 在执行信号和等待之前,我正在销毁mutex和condvar 。 要重现,只需在加入main函数中的线程之前移动destroy函数。 令人惊讶的是,在我的两台机器上,这会产生100%一致(和错误)的行为。 Stupid error. I was destroying the mutex and condvar before executing signal and wait. To reproduce, just move the destroy functions before th...

malloc()不是一个可以从信号处理程序安全地调用的函数。 这不是一个异步信号安全功能。 所以,你不应该从信号处理程序调用malloc()。 您只能从信号处理程序中调用一组有限的函数。 查看man信号 ,查看可以从信号处理程序中安全调用的函数列表。 看着你的GDB输出,看起来虽然malloc()持有一个锁,但你再次调用malloc()会导致死锁。 malloc() is not a function that can be safely called from a signal handler....

您可以在信号处理程序中执行哪种代码没有限制。 你只需要记住,在执行你的信号处理程序时,另一个信号可能会到达,让你处于半完成函数,锁定的互斥锁或其他应该更好地保持不间断的事物中间。 通常你会让信号处理程序设置一个标志信号给所有线程,以便很好地退出,从信号处理程序返回,然后让你的代码正常退出。 There are no limitations of what kind of code you can execute inside a signal handler. You just have to k...

我不认为在信号处理程序中抛出异常是一种很好的做法。 操作系统期望信号处理程序return ,因为在调用它的处理程序时信号被阻塞。 通过抛出异常可以防止系统解锁信号。 I don't think throwing an exception inside a signal handler is good practice. The operating system expects the signal handler to return, because the signal is blocked w...

首先,你的问题(“我在信号处理程序中吗?”)没有明确定义的答案。 请考虑以下代码: #include

#include

jmp_buf jb;

int foo(int s)

{

longjmp(jb,1);

}

int main()

{

if (setjmp(jb)) {

puts("Am I in a signal handler now, or not?");

return 0;

}

...

glibc文档说 : 调用可能设置errno或修改浮点环境的函数的信号处理程序必须保存其原始值,并在返回之前恢复它们。 所以继续这样做。 对于那些无法重写信号处理程序的读者,可能会有一种解决方法。 如果您使用pthreads编写多线程程序,则errno将位于线程本地存储中。 因此,您可以将一个线程专用于处理信号并阻止所有其他线程中的信号。 The glibc documentation says: signal handlers that call functions that may set e...

这是否意味着信号将会对任何类型的睡眠和暂停功能产生影响? 可能不是全部 ,但它会中断pause() ,是的。 来自pause()的文档(Linux) : 返回值 pause()仅在捕获到信号并返回信号捕获函数时返回。 在这种情况下, pause()返回-1,并且errno设置为EINTR 。 Does it mean that signal will inter[r]upt any kind of sleep and suspension functions? Probably not all, ...

在信号处理程序中,只允许非常有限数量的系统调用。 见男人7信号 http://man7.org/linux/man-pages/man7/signal.7.html 我的建议是,为了安全起见,所谓的“自我管道技巧”。 http://man7.org/tlpi/code/online/diff/altio/self_pipe.c.html 您可以启动一个在自管道上运行选择循环的线程并调用您的适当处理程序。 您的代码有什么问题? 您正在Signal处理程序中锁定互斥锁 编辑:这里有一个信号指南http...

信号(SIGQUIT,SIG_IGN); 从您的信号处理程序,您告诉您的程序忽略任何进一步的信号发生情况。 因此,当您再次发送信号时,它会被忽略,就像您告诉它一样。 signal(SIGQUIT,SIG_IGN); From your signal handler, you told your program to ignore any further cases of the signal happening. As a result, as you send the signal again,...

相关文章

翻译前声明: 本翻译对于原文进行了适量删节和修改。 本翻译只做为学习参考使用,不得用于任何商业目的

...

solr 索引备份最简单的方式是通过Replication Handler。在使用Replicatio

...

经过将近一天的努力,终于搞定了Solr的Data Import Request HandlerSche

...

Solr学习笔记之5、Component(组件)与Handler(处理器)学习 一、搜索篇 拼写检查(

...

Now,let us begin to install the Hadoop on your linu

...

1、首先下载Solr、mmseg4j分词包、tomcat并解压,这用google、百度都可以搜索得到下

...

准备工作 下载solr和tomcat   solr-4.8.1.tgz,apache-tomc

...

Linux内核最初只是由芬兰人李纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个

...

中文名: Linux内核注释 作者: 孙更新 宾晟 孙海伦 图书分类: 软件

...

中文名: 深入Linux设备驱动程序内核机制 作者: 陈学松 图书分类: 网络 资源

...

最新问答

如果启用了复制处理程序,请确保将其置于其中一个安全角色之后。 我见过人们做的另一件事是在不同的端口上运行admin。 最好在需要auth的页面上使用SSL,这样你就不会发送明确的密码,因此管理和复制将发生在8443上,而常规查询将在8080上发生。 如果您要签署自己的证书,请查看此有用的SO页面: 如何在特定连接上使用不同的证书? I didn't know that /admin was the context for SOLR admin because /admin does not re

第一:在您的样本中,您有: 但是你在询问 //td[@class=‘CarMiniProfile-TableHeader’] (注意TableHeader中的大写'T')。 xpath区分大小写。 第二:通过查询// td [@ class ='CarMiniProfile-TableHeader'] / td,你暗示你在外部td中有一个'td'元素,而它们是兄弟姐妹。 有很多方法可以在这里获得制作和模型

这是你的答案: http://jsfiddle.net/gPsdk/40/ .preloader-container { position: absolute; top: 0px; right: 0px; bottom: 0px; left: 0px; background: #FFFFFF; z-index: 5; opacity: 1; -webkit-transition: all 500ms ease-out;

问题是,在启用Outlook库引用的情况下, olMailItem是一个保留常量,我认为当您将Dim olMailItem as Outlook.MailItem ,这不是问题,但是尝试设置变量会导致问题。 以下是完整的解释: 您已将olMailItem声明为对象变量。 在赋值语句的右侧,在将其值设置为对象的实例之前,您将引用此Object 。 这基本上是一个递归错误,因为你有对象试图自己分配自己。 还有另一个潜在的错误,如果之前已经分配了olMailItem ,这个语句会引发另一个错误(可能是

我建议使用wireshark http://www.wireshark.org/通过记录(“捕获”)设备可以看到的网络流量副本来“监听”网络上发生的对话。 当您开始捕获时,数据量似乎过大,但如果您能够发现任何看起来像您的SOAP消息的片段(应该很容易发现),那么您可以通过右键单击并选择来快速过滤到该对话'关注TCP Stream'。 然后,您可以在弹出窗口中查看您编写的SOAP服务与Silverlight客户端之间的整个对话。 如果一切正常,请关闭弹出窗口。 作为一个额外的好处,wireshar

Android默认情况下不提供TextView的合理结果。 您可以使用以下库并实现适当的aligntment。 https://github.com/navabi/JustifiedTextView Android Does not provide Justified aligntment of TextView By default. You can use following library and achieve proper aligntment. https://github.com/

你的代码适合我: class apples { public static void main(String args[]) { System.out.println("Hello World!"); } } 我将它下载到c:\ temp \ apples.java。 以下是我编译和运行的方式: C:\temp>javac -cp . apples.java C:\temp>dir apples Volume in drive C is HP_PAV

12个十六进制数字(带前导0x)表示48位。 那是256 TB的虚拟地址空间。 在AMD64上阅读wiki(我假设你在上面,对吗?)架构http://en.wikipedia.org/wiki/X86-64 12 hex digits (with leading 0x) mean 48 bits. That is 256 TB of virtual address space. Read wiki on AMD64 (I assume that you are on it, right?) ar

这将取决于你想要的。 对象有两种属性:类属性和实例属性。 类属性 类属性对于类的每个实例都是相同的对象。 class MyClass: class_attribute = [] 这里已经为类定义了MyClass.class_attribute ,您可以使用它。 如果您创建MyClass实例,则每个实例都可以访问相同的class_attribute 。 实例属性 instance属性仅在创建实例时可用,并且对于类的每个实例都是唯一的。 您只能在实例上使用它们。 在方法__init__中定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值