问题标签 [async-safe]
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.
linux - 我需要来自 glibc 的异步信号安全函数列表
非系统调用的包装器,但类似于 snprintf()、dprintf()
c - 有没有办法测试我是否在信号处理程序中?
我必须处理一个可以从大型项目中的不同位置调用的日志记录模块。我遇到的问题是,有时可以从信号处理程序中执行的代码调用模块。通常,日志记录模块使用 localtime() 和 strftime() 包含时间数据,但当然这些调用不是异步信号安全的,如果从信号处理程序中调用可能会导致死锁。有没有办法(在 GNU/Linux 系统上)来判断我的代码当前是否在信号处理程序上下文中执行,除了例如让每个信号处理程序在处理时设置一个标志?我认为简化我们的信号处理程序会更好,但在这种情况下,我无法选择调用日志模块的位置。
c - linux信号屏蔽函数中sig_atomic_t的使用
我最近在学习名为 Advanced Linux Programming 的书,我遇到了这个问题:书中说你应该使用sig_atomic_t
变量类型来确保如果你在信号处理函数中设置全局标志或计数器,则不会发生上下文切换算术运算(即++
)并将其保存到寄存器中。
我的问题是:如果我们不使用sig_atomic_t
而只使用另一种类型并且发生上下文切换会发生什么?例如,我的意思是该程序稍后会返回并保存它。有人可以给我一个场景,它会使我们的代码不稳定或有问题吗?
linux - 如何在多线程应用程序中使用异步信号管理共享 POSIX 信号量
我必须编写一个线程安全库,它使用 POSIX 信号量(用作初始值 = 1 的互斥锁)进行同步。我发现了一些正确管理异步信号的问题。我有一个链接到这个静态库的应用程序,并且应用程序(多线程)调用库的函数。对某些内部结构的访问由 posix 信号量控制(它在库内部):
SIGINT
如果在一个线程锁定信号量时引发了一个异步信号,比如说 ,会追加什么?如果我重新启动应用程序,我将遇到死锁,因为信号量存在并且它的值是0
. 有一个函数library_close
可以在引发异步信号时释放信号量,但这是最好的检查方法(我认为该函数只有在跟随时才是信号安全的exit
)?在多线程应用程序中,对所有信号使用单个线程管理器通常是一个好习惯:这个线程应该在库中还是可以在应用程序中启动它?
谢谢你们。
c - 使用写入或异步安全函数从信号处理程序打印 int
write
我想在信号处理程序中使用(或任何异步安全函数)将数字打印到日志或终端。我宁愿不使用缓冲 I/O。
有没有一种简单且推荐的方法来做到这一点?
例如代替printf
, 下面我更喜欢write
(或任何异步安全功能)。
打印字符串很容易。代替printf
上面我可以使用(不打印pid
):
c++ - 对向量(vector::operator[] 和 vector::size())的只读访问是异步安全的吗?
vector<string>
我的程序需要对信号处理程序中的内容执行只读访问SIGINT
。(替代方法是使用固定长度的 C 字符串的固定大小数组。)该程序设计为在 POSIX 环境中运行。
vector::operator[]
和vector::size()
异步安全(或信号安全)?
c - 当我从信号处理程序调用非异步安全函数时,它总是不安全吗?
我只是想知道是否可以在信号处理程序中调用非异步安全函数。
来自 Linux 手册页 signal(7) 的引用:
如果信号中断了不安全函数的执行,并且处理程序调用了不安全函数,则程序的行为是未定义的。
和TLPI:
SUSv3 指出,表 21-1(异步安全函数列表)中未列出的所有函数都被认为对信号不安全,但指出只有在调用信号处理程序中断一个函数的执行时,该函数才是不安全的。 unsafe 函数,并且处理程序本身也调用了 unsafe 函数。
我对上述引用的解释是,只有当信号处理程序没有中断非异步安全函数时,才可以安全地从信号处理程序调用非异步安全函数。
例如,我为 SIGINT 安装了一个处理程序,它调用了一个假定crypt(3)
为不可重入即不安全的不安全函数。
而且我还调用printf()
了一个无限循环main()
,我只有主线程在运行。
printf()
问题是这个简单的例子,当处理程序中断执行并调用不安全的函数时,我没有看到任何不好的事情发生。AFAK,printf()
将获得一个控制台锁,并有一个内部缓冲区来执行缓冲的 I/O,但它的状态在这个例子中是一致的。虽然crypt()
返回一个静态分配的字符串,但它不与其他函数或线程共享。
我是不是误会了什么?我希望有人澄清一下,让信号处理程序中断主程序中不安全函数的执行并且本身也调用不安全函数或者在某些情况下这样做是安全的(例如上面的简单示例)总是不安全的?
c - 读取 MP3 IDV2 标签大小
我正在尝试读取 ID3V2 标签的大小。我的代码应该存储第一个标头,其中包含此结构中的标识、版本、标志和大小。代码从第 0 位读取到第 9 位并将其存储在这里
阅读:
然后将 tag.size 的值传递给这个不同步大小位的函数:
然而,synchsafe 的返回值永远不可能是正确的标头大小。我得到了 248627840。我使用 exif 工具进行了仔细检查,结果不正确。我真的很感激任何帮助
signals - 为什么只能从信号处理程序调用异步安全函数?
我知道,从信号处理函数中,sigaction()
我应该只调用那些“异步安全”的函数。但为什么会这样?
c - 未定义为异步安全的函数,例如 mmap(2),是否会影响信号处理程序中调用的其他异步安全函数?
我正在制作一个库,它被注入进程并重新定义一些函数,例如 open(2) 在调用真正的 open(2) 之前执行一些任务。我的图书馆会调用 mmap(2)。由于 open(2) 是异步安全的,是否有人使用在信号处理程序中调用 open(2) 并且我的库还添加了对 mmap(2) 的调用的库的人可能会使他对 open(2) 的调用出错?
更新的问题:
在上面的函数中,对 open(2) 的调用是否会因为我调用了 mmap(2) 而受到影响?