- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是系统编程的新手,我遇到了这个程序。
#include "apue.h"
static void sig_alrm(int);
int main(void)
{
int n;
char line[MAXLINE];
if (signal(SIGALRM, sig_alrm) == SIG_ERR)
err_sys("signal(SIGALRM) error");
alarm(10);
if ((n = read(STDIN_FILENO, line, MAXLINE)) < 0)
err_sys("read error");
alarm(0);
write(STDOUT_FILENO, line, n);
exit(0);
}
static void sig_alrm(int signo)
{
/* nothing to do, just return to interrupt the read */
}
该程序旨在为 read() 系统调用提供超时。如果 read() 花费的时间超过 30 秒,则会生成一个信号。现在,
引用教科书(它列出了程序中的2个缺陷,其中一个是)
If system calls are automatically restarted, the read is not interrupted when the SIGALRM signal handler returns. In this case, the timeout does nothing.
我无法理解这句话的意思。谁能解释一下
谢谢。
最佳答案
以下注意事项适用于 Linux <= 2.6.11,但我相信这些概念也适用于最近的内核。
如果一个进程在系统调用时被阻塞,它会被放入等待队列中,处于 TASK_INTERRUPTIBLE
或 TASK_UNINTERRUPTIBLE
状态。在前一种情况下,内核在收到信号后将其放回 TASK_RUNNING
状态,将进程添加到运行队列并将信号添加到待处理信号列表中。
当进程被调度时,它继续执行系统调用。由于系统调用未完成,可能的返回码是:
EINTR
ERESTARTNOHAND
ERESTART_RESTARTBLOCK
ERESTARTSYS
ERESTARTNOINTR
在系统调用的退出路径上,检查未决信号。在这种情况下,您的 SIG_ALRM
处理程序被调用,然后内核立即检查系统调用的返回代码。一般来说,可能会出现以下情况:
EINTR
:用户态进程恢复,read
的返回值为-EINTRERESTARTNOINTR
:系统调用重新执行ERESTARTSYS
:如果设置了 SA_RESTART 标志,则重新执行系统调用,否则 -EINTR 返回给用户空间。ERESTARTNOHAND
或 ERESTART_RESTARTBLOCK
:用户模式进程恢复并返回 -EINTR。重新执行系统调用意味着进程 EIP 减 2,因此被迫再次执行 int 0x80
。
在这种特定情况下,如果进程在来自 STDIN 的读取系统调用上被阻塞,并且它从 man 7 signal
接收到 SIG_ALRM
,系统中断部分信号处理程序的调用和库函数:
If a blocked call to one of the following interfaces is
interrupted by a signal handler, then the call will be
automatically restarted after the signal handler returns
if the SA_RESTART flag was used; otherwise the call will
fail with the error EINTR.
* read(2), readv(2), write(2), writev(2), and ioctl(2)
calls on "slow" devices. A "slow" device is one where the
I/O call may block for an indefinite time, for example, a
terminal, pipe, or socket. (A disk is not a slow device
according to this definition.) If an I/O call on a slow
device has already transferred some data by the time
it is interrupted by a signal handler, then the call
will return a success status (normally, the number of bytes
transferred).
这是 ERESTARTSYS 返回代码的行为,即只有在设置了 SA_RESTART 的情况下,系统调用才会在捕获到信号时重新执行,否则它将返回 EINTR(如果尚未传输任何数据)。
所以你书中的第一个陈述
If system calls are automatically restarted [...]
表示
If, upon receiving a signal, SA_RESTART is set
如果是,则系统调用重启,再次阻塞,告警无效。
引用资料:
关于c - 超时调用读取的缺陷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26990261/
我的 slideToggle 在幻灯片切换的底部有点跳动。会不会是因为那里有一个按钮之类的。任何使它更平滑的方法。尝试使用缓动但不是很成功。有什么建议 点击视频设置自己看看 The site $(do
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
概述: 我的 B 对象是一个 100 000 * 5000 的 2 GB 大矩阵 我的 A 对象较小 1000 * 5000 analyse_with_glm <- function(Y) { c
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 6年前关闭。 Improve t
我在从 SQL Server (2008R2) 数据库中的 NVARCHAR 字段检索加密数据时遇到了问题,对于某些记录,我的 C# .NET 应用程序中数据的字符串值与数据库记录中的数据字符串值不同
我从 main.cpp 中包含两个头文件,它们在匿名命名空间中具有以下定义:const string strToken = ("%");使用 g++ 4.9 版编译结果如下: In file incl
我正在测试的代码中出现信任边界冲突。该代码在 session 中添加表单,并且由于违反信任边界而存在缺陷 Inside Struts Action class execute method { Ed
这个问题没有与之相关的实际问题,它更多的是一个好奇的问题,想知道我是否过于字面意思;)。 所以我一直在努力尽可能多地理解 c++ 标准。今天,在深入研究标准时,我注意到了这一点 (ISO/IEC 14
在我的数据库中,我必须做一个Circular Reference(cycle)来获取我想要的数据,我不知道如何重新排序表来获取我想要的数据而不需要循环. 这是我的数据库的模式(或模型)——只有表名是英
我有一个代表一组数字的类。构造函数接受三个参数: startValue 、 endValue 和 stepSize 。 该类负责保存一个列表,其中包含考虑 stepSize 的开始值和结束值之间的所有
如何删除下图中标记的三个间隙? 此代码可在 http://jsfiddle.net/69zj6smo/ 获得- 调整渲染区域的大小以查看通常存在的一些线条。 让我感到困惑的是,我认为我总是创建这样的流
double 的位格式在第一位存储符号。 double的C#哈希算法是高低32位二进制异或。 因此,当您对 double A 及其负数 -A 进行哈希处理时,哈希值的唯一区别在于第一位。 要散列多个字
当我在 Action 中使用重定向时,afterAction 方法(在 controller.php 中)不起作用!我该如何解决这个问题? 注意:我不能使用 beforeAction 因为我在我的 A
毫无疑问,还有其他可能更好的方法可以做到这一点,但我正在努力了解这里发生了什么。 在下面的示例中,coverity 在第四行报告了 FORWARD_NULL 缺陷。 double? foo = nul
我们希望针对 Jenkins 中失败的构建自动在 Jira 中创建缺陷。如果您成功完成了此操作,可以与我分享吗? 最佳答案 您应该能够使用JIRA plugin来做到这一点,以及“JIRA:创建问题”
有人能解释一下为什么 VeraCode 似乎认为使用 name 作为公共(public)属性(property)是一个坏主意,并提出了一个好的缓解措施吗? 代码(JavaScript): var Ba
我认为这是 C++11 标准中的一个(次要)缺陷。在 [dcl.dcl] 中我们有: simple-declaration: decl-specifier-seqopt init-
我做了以下... private static IDbConnectionProvider CreateSqlConnectionProvider(DbConfig dbConfig) { r
我现在在运行我的 cakephp 应用程序时遇到了很多麻烦。 在将 vom lenny 升级为 squeeze(甚至尝试完全重新安装 sqeeze)之后,imagick 的速度非常慢,以至于它只是关闭
我收到来自 Veracode 的信任边界违规。我的代码是 userName= req.getParameter(Constant.USERNAME); session.setAttribute(Con
我是一名优秀的程序员,十分优秀!