首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么malloc不是异步信号安全?

在C语言中,malloc函数用于动态分配内存。它不是异步信号安全的,因为它可能会引发其他函数的调用,这可能会导致程序在信号处理函数中出现未定义行为。

异步信号安全是指在信号处理函数中执行的操作不会引发其他函数调用,从而避免了潜在的竞争条件和未定义行为。为了确保异步信号安全,信号处理函数应该避免使用非原子操作和可能引发其他函数调用的函数。

malloc函数可能会引发其他函数调用,例如sbrk系统调用,这可能会导致程序在信号处理函数中出现未定义行为。因此,malloc不是异步信号安全的。

在信号处理函数中,可以使用异步信号安全的内存分配函数,例如callocreallocposix_memalign,这些函数在内部使用mmap系统调用来分配内存,而不是使用malloc。这些函数是异步信号安全的,因为它们不会引发其他函数调用。

总之,malloc不是异步信号安全的,因为它可能会引发其他函数调用,这可能会导致程序在信号处理函数中出现未定义行为。在信号处理函数中,可以使用异步信号安全的内存分配函数,例如callocreallocposix_memalign,这些函数在内部使用mmap系统调用来分配内存,而不是使用malloc

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么 StringBuilder 不是线程安全的?

我:StringBuilder不是线程安全的,StringBuffer是线程安全的 面试官:那StringBuilder不安全的点在哪儿? 我:。。。...(哑巴了) 在这之前我只记住了StringBuilder不是线程安全的,StringBuffer是线程安全的这个结论,至于StringBuilder为什么安全从来没有去想过。...我们看到输出了“9326”,小于预期的10000,并且还抛出了一个ArrayIndexOutOfBoundsException异常(异常不是必现)。...这就是为什么测试代码输出的值要比10000小的原因。 2、为什么会抛出ArrayIndexOutOfBoundsException异常。...至此,StringBuilder为什么安全已经分析完了。如果我们将测试代码的StringBuilder对象换成StringBuffer对象会输出什么呢? 当然是输出10000啦!

59420

为什么 StringBuilder 不是线程安全的?

我:StringBuilder不是线程安全的,StringBuffer是线程安全的 面试官:那StringBuilder不安全的点在哪儿? 我:。。。...(哑巴了) 在这之前我只记住了StringBuilder不是线程安全的,StringBuffer是线程安全的这个结论,至于StringBuilder为什么安全从来没有去想过。...我们看到输出了“9326”,小于预期的10000,并且还抛出了一个ArrayIndexOutOfBoundsException异常(异常不是必现)。...这就是为什么测试代码输出的值要比10000小的原因。 2、为什么会抛出ArrayIndexOutOfBoundsException异常。...至此,StringBuilder为什么安全已经分析完了。如果我们将测试代码的StringBuilder对象换成StringBuffer对象会输出什么呢? ? 当然是输出10000啦!

57620
  • 为什么 StringBuilder 不是线程安全的?

    我:StringBuilder 不是线程安全的,StringBuffer 是线程安全的 面试官:那 StringBuilder 不安全的点在哪儿? 我:。。。...(哑巴了) ❞ 在这之前我只记住了 StringBuilder 不是线程安全的,StringBuffer 是线程安全的这个结论,至于 StringBuilder 为什么安全从来没有去想过。...StringBuilder线程安全 我们看到输出了“9326”,小于预期的 10000,并且还抛出了一个 ArrayIndexOutOfBoundsException 异常(异常不是必现)。...这就是为什么测试代码输出的值要比 10000 小的原因。 2、为什么会抛出 ArrayIndexOutOfBoundsException 异常。...至此,StringBuilder 为什么安全已经分析完了。如果我们将测试代码的 StringBuilder 对象换成 StringBuffer 对象会输出什么呢? 当然是输出 10000 啦!

    36920

    为什么 StringBuilder 不是线程安全的?

    我:StringBuilder不是线程安全的,StringBuffer是线程安全的 面试官:那StringBuilder不安全的点在哪儿?我:。。。...(哑巴了) 在这之前我只记住了StringBuilder不是线程安全的,StringBuffer是线程安全的这个结论,至于StringBuilder为什么安全从来没有去想过。...我们先不管代码的第五行和第六行干了什么,直接看第七行,count += len不是一个原子操作。...这就是为什么测试代码输出的值要比10000小的原因。 2、为什么会抛出ArrayIndexOutOfBoundsException异常。...至此,StringBuilder为什么安全已经分析完了。如果我们将测试代码的StringBuilder对象换成StringBuffer对象会输出什么呢? ? 当然是输出10000啦!

    52830

    从源代码理解atomic为什么不是线程安全

    所以面试的时候如果举这个例子~~说明你就没明白atomic的非线程安全性! 首先你得知道什么是线程不安全,线程的不安全是由于多线程访问和修改共享资源而引起的不可预测的结果(有可能crash)。...(UIImage *)atomicImage { @synchronized (self) { return _atomicImage; } } 源代码分析atomic为什么不是线程安全...其实现在一想很奇怪,为什么要把atomic和线程安全联系在一起去探究;atomic只是对属性的getter/setter方法进行了加锁操作,这种安全仅仅是get/set的读写安全,仅此之一,但是线程安全还有除了读写的其他操作...} }); 结果可能是[10000,20000]之间的某个值,而我们想要的结果是20000;很明显这个例子就会引起线程隐患,而atomic并不能防止这个问题;所以我们说atomic不是线程安全...既然被弃用了,这里为什么还在用;原因是进入spinlock去看会发现,底层已经被os_unfair_lick替换: using spinlock_t = mutex_tt; class

    2K20

    为什么使用OPA而不是原生的Pod安全策略?

    /www.magalix.com/blog/enforce-pod-security-policies-in-kubernetes-using-opa 在本文中,我们将演示如何使用OPA执行最细粒度的安全策略...,可以在其中对Pod应用非常特定的安全控制。...为什么使用OPA而不是原生的Pod安全策略? 使用Pod安全策略来执行我们的安全策略并没有什么问题。然而,根据定义,PSP只能应用于pods。...请注意,我们使用的OPA是使用kube-mgmt部署的,而不是OPA Gatekeeper。 Rego的策略代码 在本文中,我们假设你已经熟悉了OPA和Rego语言。...它包括容器名称和违规的安全上下文。 第7-9行:input_containers[c]函数从请求对象中提取容器。注意,使用了_字符来遍历数组中的所有容器。

    1.2K20

    linux系统编程之基础必备(六):可重入函数、线程安全、volatile

    以上三者的关系为:可重入函数 必然 是 线程安全函数 和 异步信号安全函数; 线程安全函数不一定是可重入函数。...举个例子,strtok是既不可重入的,也不是线程安全的;加锁的strtok不是可重入的,但线程安全;而strtok_r 既是可重入的,也是线程安全的。...也就是说函数如果使用静态变量,通过加锁后可以转成线程安全函数,但仍然有可能不是可重入的。我们所熟知的malloc 也是线程安全不是可 重入的。        ...假设该函 数在某次执行过程中,在已经获得资源锁之后,有异步信号发生,程序的执行流转交给对应的信号处理函数;再假设在该信号处理函数中也需要调用函 数 func(),那么func()在这次执行中仍会在访问共享资源前试图获得资源锁...信号处理函数是一个单独的控制流程,因为它和主控制流程是异步的,二者不存在调用和被调用的关系,并且使用不同的堆栈空间。

    1.3K20

    使用可重入函数进行更安全信号处理

    信号的生成和处理尤其增加了额外的复杂性。由于信号在本质上是异步的,所以难以找出当信号处理函数触发某个不可重入函数时导致的 bug。...信号和不可重入函数 信号(signal) 是软件中断。它使得程序员可以处理异步事件。为了向进程发送一个信号,内核在进程表条目的信号域中设置一个位,对应于收到的信号的类型。...如果当进程正在使用 malloc 在它的堆上分配额外的内存时,您通过信号处理器调用 malloc,那会怎样?或者,调用了正在处理全局数据结构的某个函数,而在信号处理器中又调用了同一个函数。...使用信号的另一个新增的困难是,只通过运行测试用例不能够确保代码没有信号 bug。这一困难的原因在于信号生成本质上异步的。...不过这必须要小心进行,因为将一个对象添加到一个链并不是原子操作,如果它被另一个做同样动作的信号处理器打断,那么就会“丢失”一个对象。

    1.6K20

    我的大厂面试经历(附100+面试题干货)

    Dynamic_cast:针对基类和派生类指针和引用转换,基类和派生类之间必须要继承关系,是安全的    Reinterpret_cast:允许将任何指针类型转为其他指针类型,是安全的  8:Malloc...进程:共享内存,消息队列传递,无名管道,有名管道,信号,套接字    线程:锁机制,信号量,信号  55:IO模型主要有哪些?   阻塞,非阻塞,IO多路复用,异步  56:阻塞和非阻塞?...同步与异步的区别?   自己领悟  57:Select,poll和epoll的区别?为什么?  ...信号量;管程;  67:什么是信号?   进程间通信机制中唯一的异步通信机制  68:kill函数的每一个参数的作用?  ...为什么?   不可以,因为string不是类  104:Char * const *(*next)()是什么?

    1.3K20

    知识总结:C++工程师106道面试题总结(含答案详解)

    Dynamic_cast:针对基类和派生类指针和引用转换,基类和派生类之间必须要继承关系,是安全的    Reinterpret_cast:允许将任何指针类型转为其他指针类型,是安全的  Malloc...进程:共享内存,消息队列传递,无名管道,有名管道,信号,套接字    线程:锁机制,信号量,信号  IO模型主要有哪些?   阻塞,非阻塞,IO多路复用,异步  阻塞和非阻塞?...同步与异步的区别?   自己领悟  Select,poll和epoll的区别?为什么?  ...信号量;管程;  什么是信号?   进程间通信机制中唯一的异步通信机制  kill函数的每一个参数的作用?  ...为什么?   不可以,因为string不是类  Char * const *(*next)()是什么?

    2.6K90

    可重入函数对于线程安全的意义(附函数表)

    可重入函数可以有多余一个任务并发使用,而不必担心数据错误,相反,不可重入函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在 代码的关键部分禁用中断)。...为什么 为什么有的函数可重入,又有的函数不可重入?...为什么不可重入 不可重入的特点:如果一个函数符合以下条件之一则是不可重入的 (1)调用了malloc/free函数,因为malloc函数是用全局链表来管理堆的 (2)调用了标准I/O库函数,标准I...编写可重入函数时,若使用全局变量,则应通过关中断、信号量(即P、V操作)等手段对其加以保护。 举例 Linux下常见可重入函数 ?...(4)、如果一个函数中有全局变量,那么这个函数既不是线程安全不是可重入的。

    2.7K20

    扒虫篇-Debug几个实用的方法

    C语言是一门危险的语言,内存安全是一个主要的问题。C语言中根本没有内存安全可言。...像下面的代码,会被正常的编译,而且可能正常运行: char *ptr = malloc(5); ptr[12] = 0; 对于内存安全的验证已经有一些解决方案了。...如Clang的静态代码分析,可以从代码中查找特定类型的内存安全问题。如Valgrind之类的程序可以在运行时检测到不安全的内存访问。 Address Sanitizer是另外一种解决方案。...malloc函数总是最少分配16个字节。为了储存针对标准malloc的内存的保护,需要分配内存到16字节的范围内,因此,若分配的内存大小不是16字节的整数倍,余出的几个字节将不受保护。...它是一种异步的通知机制,用来提醒进程一个事件已经发生。当一个信号发送给一个进程,操作系统中断了进程正常的控制流程,此时,任何非原子操作都将被中断。

    1.5K10

    UIUC CS241 讲义:众包系统编程书

    信号处理程序内的可执行代码受到严格限制。大多数库和系统调用都不是异步信号安全”的 - 它们不能在信号处理程序内使用,因为它们不是可重入安全的。...信号处理程序内部的可执行代码有严格的限制。大多数库和系统调用都不是异步信号安全”的 - 它们不能在信号处理程序内部使用,因为它们不是可重入安全的。...编写自定义信号处理线程(如下面的示例)的一个优点是,现在您可以使用更多的 C 库和系统函数,否则不能安全地在信号处理程序中使用,因为它们不是异步信号安全的。...为什么要使用 sigaction 而不是 signal? 我如何异步和同步地捕获信号? 在我 fork 后,挂起的信号会怎样?Exec? 我 fork 后我的信号处理怎么样?...信号:复习问题 给出通常由内核生成的两个信号的名称 给出一个不能被信号捕获的信号的名称 为什么信号处理程序中调用任何函数(不是信号处理程序安全的函数)是不安全的?

    83710

    在C中,如何知道动态分配是否成功

    ---- 嵌入式为什么不执行malloc 这就是为什么某些嵌入式系统不执行 malloc 的原因。...“程序可以~~分配malloc~~使用比服务器上物理可用更多的内存(假设没有交换)?” 因为, malloc 从虚拟内存中分配,而不是从物理内存中分配。...当进程分叉时,由于写时复制,绝大多数子进程的内存与父进程安全共享。但是严格的计算会说系统的总内存使用量翻了一番,这在大多数情况下太保守了。由于fork在 Unix 上非常普遍,因此很快就需要过度使用。...OOM killer发送一个信号。 这就是为什么您要确保有足够的Swap分区来应对最坏的情况。使用Swap分区不是因为实际使用它,而是为了能够保证在最坏的情况发生时有足够的内存可用。...() 时保留它以避免访问内核会更快,并且这些东西都不是在标准中一成不变的,这一切都可能已经过时了几年......

    2.7K20

    进程信号

    前台进程在运行过程中用户随时可能按下 Ctrl-C 而产生一个信号,也就是说该进程的用户空间代码执行到任何地方都有可能收到 SIGINT 信号而终止,所以信号相对于进程的控制流程来说是异步的。...信号概念 信号是进程之间事件异步通知的一种方式,属于软中断。 用kill -l命令可以察看系统定义的信号列表 ?...内核决定返回用户态后不是恢复main函数的上下文继续执行,而是执行sighandler函 数,sighandler和main函数使用不同的堆栈空间,它们之间不存在调用和被调用的关系,是 两个独立的控制流程...想一下,为什么两个不同的控制流程调用同一个函数,访问它的同一个局部变量或参数就不会造成错乱?...如果一个函数符合以下条件之一则是不可重入的: 调用了malloc或free,因为malloc也是用全局链表来管理堆的。 调用了标准I/O库函数。

    1.3K20

    中科大软件学院硕士:实习秋招百多轮面试总结(上)

    内核同步:原子操作、自旋锁、读写锁、信号量(计数信号量、二值信号量)、屏障(barrier)分别的实现原理与应用机制; 2. 操作系统相关的项目经验有吗?平时写过什么代码? 三面: 1....C语言动态内存分配的几种方式与比较(malloc,calloc,realloc); 2. malloc的特点与底层实现,malloc与new的区别; 3....操作系统:进程与线程、同步I/O,异步I/O; 6. 内核态与进程态,系统调用时操作系统发生的事情; 7....如果是二叉树不是数组怎么建堆?3. 快排的时间复杂度? 4. 数据库中删除数据但保留表结构用什么? 5. TCP为什么四次挥手? 6. ARP是哪一层的协议? 7....线程安全是什么? 7. TCP三次握手的原理,为什么二次握手之后要有第三次? 8. 让你设计一个登录系统?密码在数据库里面怎么存(MD5加密?) 9. 怎么判断用户超时了需要重新登录?

    73630

    Cache一致性导致的踩内存问题

    该机制并未检测到这个错误,可能是由于下面两个原因: 检测周期较长,死机的时候还没检测到,设备就挂了 检测到了,但是打印还没来得及输出(输出是异步的,有缓冲),设备就挂了 抱着试试看的态度,把检测周期改为...示例代码如下: void *__wrap_malloc (int c) { void *ptr; /* 检测受害信号量内存是否被破坏 */ ptr = __real_malloc (c); /*...不过本次实验中有个奇怪的现象,检测到信号量异常的位置,总是在malloc或者free的前面。如果是ThreadX的内存管理模块出了问题,检测到信号量异常的位置,应该在malloc或者free的后面。...难道ThreadX的内存管理模块不是线程安全的? 从github上的源码和实际工程的反汇编看,应该是线程安全的。...根据复现现象,我们得到以下信息: 被踩区域仍然是那个信号量 进一步确认了上面的推断:不是内存管理模块将那个信号量释放的 不可思议的是,被踩区域被写入的不再是0xffffeeee, 而是0xaaaabbbb

    3K53

    蒋豆芽面试题专栏总结(C++软件开发与嵌入式软件)完成了!

    数组是根据数组的下进行访问的,数组的存储空间,不是在静态区就是在栈上。 指针:指针很灵活,它可以指向任意类型的数据。指针的类型说明了它所指向地址空间的内存。...(1)new和malloc申请资源使用后,没有用delete和free释放; (2)子类继承父类时,父类析构函数不是虚函数。 (3)Windows句柄资源使用后没有释放。...malloc需要给定申请内存的大小,返回的指针需要强转;new会调用构造函数,不用指定内存的大小,返回指针不用强转。、 new可以被重载;malloc不行 new分配内存更直接和安全。...⭐⭐⭐⭐⭐ 1.58 简述同步与异步的区别,阻塞与非阻塞的区别?⭐⭐⭐⭐⭐ 1.59 BIO、NIO有什么区别?...⭐⭐⭐⭐⭐ 1.46 HTTPS为什么比HTTP更安全⭐⭐⭐⭐⭐ 1.47 HTTPS和HTTP的区别⭐⭐⭐⭐⭐ 1.48 HTTPS的通信建立过程⭐⭐⭐⭐⭐ 蒋豆芽的秋招打怪之旅——嵌入式基础知识(仅适合嵌入式求职的同学

    2K41

    No.js---基于V8和io_uring的JS运行时

    1 为什么选io_uring io_uring是Linux下新一代的高性能异步IO框架,也是No.js的核心。在No.js中,io_uring用于实现事件循环。为什么不选用epoll呢?...而io_uring是支持异步文件IO的,并且io_uring是真正的异步IO框架,支持的功能也非常丰富,比如在epoll里我们监听一个socket后,需要把socket fd注册到epoll中,等待有连接时执行回调...4 非io_uring的处理 io_uring目前已经支持了非常多的操作,但我们也不可避免地会碰到io_uring不支持的操作,比如信号的处理。No里目前定时器和信号不是使用io_uring处理的。...在业务里,我们可能需要监听一个信号。...如果是第一次注册该信号,则调用signal注册该信号的处理函数,所有信号的处理函数都是signalHandler。接着看信号产生时的处理逻辑。

    87030
    领券