问题标签 [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.
c - 有什么方法可以等到任务在英特尔拱门中捕获 SIGALRM 信号?
我正在 Ubuntu 10.04 上编写 iwth gcc 版本 4.4.3 我不知道如何使用 sigtimedwait(),sigwait() 捕获 SIGALRM。
如果设置了计时器处理程序,sigtimedwait(),sigwait() 总是返回 EINTR(4)。如果未设置计时器处理程序,则永远不会收到 SIGALRM。
有什么方法可以等到任务在英特尔拱门中捕获 SIGALRM 信号?
c++ - 标准 C++ TCP 套接字,使用 std::async 时连接失败并出现 EINTR
当任务涉及套接字时,我无法使用 std::async 让任务并行执行。
我的程序是一个用标准 C++ 为 Linux 编写的简单 TCP 套接字服务器。当客户端连接时,会打开一个专用端口并启动单独的线程,因此每个客户端都在自己的线程中进行服务。
客户端对象包含在映射中。
我有一个向所有客户广播消息的功能。我最初是这样写的:
我已经对此进行了测试,它一次可以与 3 个客户端一起使用。消息到达所有三个客户端(一次一个),响应字符串在此循环中打印 3 次。但是,它很慢,因为消息一次只发送给一个客户端。
为了提高效率,我希望利用 std::async 为每个客户端异步调用 SendMessageToClient 函数。我像这样重写了上面的代码:
当地图中只有一个客户端时,上面的代码按预期运行。您很快看到“开始发送”,然后是“结束发送”,然后是“开始等待”,然后是 3 秒后(我在客户端响应端有 3 秒睡眠来测试这个),您会看到来自套接字的跟踪读取响应进来的函数,然后你会看到“结束等待”
问题是当地图中有多个客户端时。在打开并连接到套接字的 SendMessageToClient 函数部分中,它在下面标识的代码中失败:
输出内容为:“已连接的客户端线程:无法连接 4”。
我查看了这个错误代码,它是这样解释的:
我在互联网上四处搜索,我发现的只是一些关于系统调用被信号中断的引用。
有谁知道为什么当我一次调用一个发送消息函数时这会起作用,但是当使用异步调用发送消息函数时它会失败?有没有人有不同的建议我应该如何向多个客户发送消息?
c++ - 我想知道系统调用()中断时到达了哪个信号
我的应用程序有两个线程。每个线程通过每个套接字从服务器接收一些数据。线程等待返回 epoll_wait()。有时 epoll_wait() 返回 -1 而 errno 是 EINTR。EINTR 表示系统 call() 被信号中断。我添加到处理 EINTR。但是我不知道什么信号到达以及为什么信号到达。我想知道。
方法一。
我创建了一个线程。
当 epoll_wait() 被中断时,我无法捕捉到信号。
方法二
当我在 strace 工具中执行我的应用程序时,epoll_wait() 永远不会被中断。
我的问题在 GDB 工具中重现得很好。我需要帮助......
c - wait() 函数(在 LINUX 中)何时响应中断?
我有这样的c代码
现在,当我运行这段代码时,父进程等待,而子进程休眠。如果我现在中断(通过按ctrl+ c)父程序,UNIX(POSIX 标准)文档告诉我等待函数应该返回 -1,并将 errno 设置为 EINTR。但是,我的代码实现会杀死子进程,因为父进程将 SIGINT 信号发送给子进程。但是,令人惊讶的是,(在父进程中)wait 不会返回 pid = -1 并将 errno 设置为 EINTR。相反,它返回被杀死的子进程的 id。
对此有解释吗?
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 级别的信号处理程序运行。
那是对的吗?如果是这样,是否可以在我的代码中测试此更改?对我来说,如何编写不包含严重竞争条件的单元测试并不明显。
c - 系统调用和 EINTR 错误代码
有没有专家可以帮助我解决以下问题?
我在 C 中有以下系统调用:
我想知道它们是否会因错误代码 -1 和 errno EINTR/EAGAIN 而失败。
我应该为这些处理 EINTR/EAGAIN 吗?
该文档没有提及与 EINTR/EAGAIN 相关的任何内容,但我看到很多人处理它。
哪个是正确的?
这里还有一个提交,我在一些我知道返回 EINTR 或 EAGAIN 的系统调用中添加了一些 EINTR/EAGAIN 处理:https ://gitorious.org/zepto-web-server/zepto-web-server/commit/b1b03b9ecccfe9646e34caf3eb04689e2bbc54dd
c++ - 为什么 select() 总是以 EINTR errno 失败?
我有一个包含此功能的 C++ 应用程序:
通常,这段代码工作得很好,但是,在一个实例中,我看到它进入了一个无限循环,代码select()
一直失败EINTR
errno
。在这种情况下,调用者将超时设置为零秒和零微秒,这意味着不要等待并select()
立即返回结果。我认为EINTR
只有在信号处理程序发生时才会发生,为什么我会一遍又一遍地获取信号处理程序(超过 12 小时)?这是 Centos 5。一旦我将它放入调试器以查看发生了什么,经过几次迭代后,代码返回时没有 EINTR。请注意,被检查的 fd 是一个套接字。
我可以为上面的代码添加重试限制,但我想先了解发生了什么。
c - scanf 函数和 EINTR 信号
我正在Linux平台上工作。我有一个基于控制台的多线程应用程序,它为其他功能加载多线程共享对象库。共享对象库在内部打开一个串行端口进行通信。该库使用“打开”、“读取”和“写入”Linux 系统调用进行串行通信。串行通信使用信号处理程序来接收数据。控制台应用程序中的主线程等待“scanf”语句,以获取用户的输入。
每当串行端口上有任何活动时,都会生成信号,因此“scanf”调用会被 EINTR(中断的系统调用)中断。
有没有什么方法可以让'scanf'不会因为串口上的读写操作而被中断?
file - 如何使用 C 中的信号管理读取?
我以这种方式从文件中读取整数:
如果信号到达会发生什么?如何管理 errno == EINTR?如果 errno==EINTR,我是否必须重复阅读?
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 却没有考虑到这个问题?仅仅是文档不好还是这个功能的设计?
这个角落的案例真的让我很烦:(