问题标签 [eintr]

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.

0 投票
2 回答
1162 浏览

c - 有什么方法可以等到任务在英特尔拱门中捕获 SIGALRM 信号?

我正在 Ubuntu 10.04 上编写 iwth gcc 版本 4.4.3 我不知道如何使用 sigtimedwait(),sigwait() 捕获 SIGALRM。

如果设置了计时器处理程序,sigtimedwait(),sigwait() 总是返回 EINTR(4)。如果未设置计时器处理程序,则永远不会收到 SIGALRM。

有什么方法可以等到任务在英特尔拱门中捕获 SIGALRM 信号?

0 投票
1 回答
1047 浏览

c++ - 标准 C++ TCP 套接字,使用 std::async 时连接失败并出现 EINTR

当任务涉及套接字时,我无法使用 std::async 让任务并行执行。

我的程序是一个用标准 C++ 为 Linux 编写的简单 TCP 套接字服务器。当客户端连接时,会打开一个专用端口并启动单独的线程,因此每个客户端都在自己的线程中进行服务。

客户端对象包含在映射中。

我有一个向所有客户广播消息的功能。我最初是这样写的:

我已经对此进行了测试,它一次可以与 3 个客户端一起使用。消息到达所有三个客户端(一次一个),响应字符串在此循环中打印 3 次。但是,它很慢,因为消息一次只发送给一个客户端。

为了提高效率,我希望利用 std::async 为每个客户端异步调用 SendMessageToClient 函数。我像这样重写了上面的代码:

当地图中只有一个客户端时,上面的代码按预期运行。您很快看到“开始发送”,然后是“结束发送”,然后是“开始等待”,然后是 3 秒后(我在客户端响应端有 3 秒睡眠来测试这个),您会看到来自套接字的跟踪读取响应进来的函数,然后你会看到“结束等待”

问题是当地图中有多个客户端时。在打开并连接到套接字的 SendMessageToClient 函数部分中,它在下面标识的代码中失败:

输出内容为:“已连接的客户端线程:无法连接 4”。

我查看了这个错误代码,它是这样解释的:

我在互联网上四处搜索,我发现的只是一些关于系统调用被信号中断的引用。

有谁知道为什么当我一次调用一个发送消息函数时这会起作用,但是当使用异步调用发送消息函数时它会失败?有没有人有不同的建议我应该如何向多个客户发送消息?

0 投票
2 回答
418 浏览

c++ - 我想知道系统调用()中断时到达了哪个信号

我的应用程序有两个线程。每个线程通过每个套接字从服务器接收一些数据。线程等待返回 epoll_wait()。有时 epoll_wait() 返回 -1 而 errno 是 EINTR。EINTR 表示系统 call() 被信号中断。我添加到处理 EINTR。但是我不知道什么信号到达以及为什么信号到达。我想知道。

方法一。

我创建了一个线程。

当 epoll_wait() 被中断时,我无法捕捉到信号。

方法二

当我在 strace 工具中执行我的应用程序时,epoll_wait() 永远不会被中断。

我的问题在 GDB 工具中重现得很好。我需要帮助......

0 投票
1 回答
1946 浏览

c - wait() 函数(在 LINUX 中)何时响应中断?

我有这样的c代码

现在,当我运行这段代码时,父进程等待,而子进程休眠。如果我现在中断(通过按ctrl+ c)父程序,UNIX(POSIX 标准)文档告诉我等待函数应该返回 -1,并将 errno 设置为 EINTR。但是,我的代码实现会杀死子进程,因为父进程将 SIGINT 信号发送给子进程。但是,令人惊讶的是,(在父进程中)wait 不会返回 pid = -1 并将 errno 设置为 EINTR。相反,它返回被杀死的子进程的 id。

对此有解释吗?

0 投票
2 回答
573 浏览

python - Python:我是否需要在管道读取循环中捕获 EINTR

tl;博士

在 Python 中读取管道时,我是否应该处理 EINTR“系统调用中断”错误,如果是,我该如何测试这样的代码?

描述

在下面的回溯中,self._dataq是一个multiprocessing.Queue(从技术上讲,我正在使用该billiard库,但我认为它们基本上是相同的代码)。Python 子进程偶尔会写入队列的另一端。我认为发生的事情是一个系统调用正在读取为队列提供数据的管道,并且一个信号到达——可能是来自第二个 Ctrl+C 事件的 SIGINT(第一个 SIGINT 发生在您^C在第二行看到用户的位置记录输出,并且我的信号处理程序捕获了该 SIGINT,正如您在日志中的 WARNING 消息中看到的那样)。

上面回溯中的语句result = self._dataq.get(timeout=0.1)位于循环的中间,如下所示。循环的主要目的是让我可以放弃尝试从self._dataq何时self.timedout()开始返回True

问题

如果我关于为什么IOError发生的理论是正确的,那么当它们是由中断的系统调用引起的时,上面的try...except块应该捕获并忽略s 。IOError如果它是导致 EINTR 错误的信号,那么仅仅回到 Python 中运行该except IOError:语句的行为将允许 Python 级别的信号处理程序运行。

那是对的吗?如果是这样,是否可以在我的代码中测试此更改?对我来说,如何编写不包含严重竞争条件的单元测试并不明显。

0 投票
4 回答
6169 浏览

c - 系统调用和 EINTR 错误代码

有没有专家可以帮助我解决以下问题?

我在 C 中有以下系统调用:

我想知道它们是否会因错误代码 -1 和 errno EINTR/EAGAIN 而失败。

我应该为这些处理 EINTR/EAGAIN 吗?

该文档没有提及与 EINTR/EAGAIN 相关的任何内容,但我看到很多人处理它。

哪个是正确的?

这是我注册信号处理程序的方法:https ://gitorious.org/zepto-web-server/zepto-web-server/source/b1b03b9ecccfe9646e34caf3eb04689e2bbc54dd:src/signal-dispatcher-utility.c

使用此配置:https ://gitorious.org/zepto-web-server/zepto-web-server/source/b1b03b9ecccfe9646e34caf3eb04689e2bbc54dd:src/server-signals-support-utility.c

这里还有一个提交,我在一些我知道返回 EINTR 或 EAGAIN 的系统调用中添加了一些 EINTR/EAGAIN 处理:https ://gitorious.org/zepto-web-server/zepto-web-server/commit/b1b03b9ecccfe9646e34caf3eb04689e2bbc54dd

0 投票
1 回答
5720 浏览

c++ - 为什么 select() 总是以 EINTR errno 失败?

我有一个包含此功能的 C++ 应用程序:

通常,这段代码工作得很好,但是,在一个实例中,我看到它进入了一个无限循环,代码select()一直失败EINTR errno。在这种情况下,调用者将超时设置为零秒和零微秒,这意味着不要等待并select()立即返回结果。我认为EINTR只有在信号处理程序发生时才会发生,为什么我会一遍又一遍地获取信号处理程序(超过 12 小时)?这是 Centos 5。一旦我将它放入调试器以查看发生了什么,经过几次迭代后,代码返回时没有 EINTR。请注意,被检查的 fd 是一个套接字。

我可以为上面的代码添加重试限制,但我想先了解发生了什么。

0 投票
1 回答
525 浏览

c - scanf 函数和 EINTR 信号

我正在Linux平台上工作。我有一个基于控制台的多线程应用程序,它为其他功能加载多线程共享对象库。共享对象库在内部打开一个串行端口进行通信。该库使用“打开”、“读取”和“写入”Linux 系统调用进行串行通信。串行通信使用信号处理程序来接收数据。控制台应用程序中的主线程等待“scanf”语句,以获取用户的输入。

每当串行端口上有任何活动时,都会生成信号,因此“scanf”调用会被 EINTR(中断的系统调用)中断。

有没有什么方法可以让'scanf'不会因为串口上的读写操作而被中断?

0 投票
1 回答
106 浏览

file - 如何使用 C 中的信号管理读取?

我以这种方式从文件中读取整数:

如果信号到达会发生什么?如何管理 errno == EINTR?如果 errno==EINTR,我是否必须重复阅读?

0 投票
2 回答
2002 浏览

c - 对 fclose 进行正确的错误处理是不可能的(根据手册页)?

所以我一直在研究 fclose 手册页,我的结论是,如果 fclose 被某些信号打断,根据手册页,没有办法恢复......?我错过了什么吗?

通常,对于无缓冲的 POSIX 函数(打开、关闭、写入等),总是有一种方法可以通过重新启动调用从信号中断 (EINTR) 中恢复;相反,缓冲调用的文档指出,在 fclose 尝试失败后,另一次尝试具有未定义的行为......没有提示如何恢复。如果信号中断 fclose,我只是“不走运”吗?数据可能会丢失,我无法确定文件描述符是否实际关闭。我知道缓冲区已被释放,但文件描述符呢?考虑一下同时使用大量 fd 的大型应用程序,如果 fd 没有正确释放会遇到问题 -> 我认为必须有一个 CLEAN 解决方案来解决这个问题。

因此,假设我正在编写一个库,并且不允许使用 sigaction 和 SA_RESTART 并且发送了很多信号,如果 fclose 被中断,我该如何恢复?在 fclose 因 EINTR 失败后,在循环中调用 close(而不是 fclose)是个好主意吗?fclose 的文档根本没有提到文件描述符的状态。不过 UNDEFINED不是很有帮助...如果 fd 关闭并且我再次调用 close ,可能会出现奇怪的难以调试的副作用,所以我很自然地宁愿忽略这种情况,因为做错了...然后再一次,那里没有无限数量的文件描述符可用,资源泄漏是某种错误(至少对我而言)。

当然,我可以检查fclose 的一个具体实现,但我不敢相信有人设计了 stdio 却没有考虑到这个问题?仅仅是文档不好还是这个功能的设计?

这个角落的案例真的让我很烦:(