问题标签 [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 投票
8 回答
6167 浏览

c - 单元测试错误条件 - EINTR

简而言之,您如何在系统调用中对错误条件(例如 EINTR)进行单元测试。

我正在研究的一个特定示例(可能本身就是一个案例)是,当 fclose 返回带有 (errno==EINTR) 的 EOF 时,是否有必要再次调用 fclose。该行为取决于 fclose 的实现:

如果在 EINTR 发生时释放 fp,则此调用可能是不安全的。如何测试 when (errno==EINTR) 的错误处理?

0 投票
2 回答
1378 浏览

sockets - 多线程应用程序中的套接字读取返回零字节或 EINTR (104)

我现在是一段时间的 c 编码器 - 既不是新手也不是专家。现在,我在 PPC Linux 上使用 C 语言有一个特定的守护程序应用程序。我使用 PHP 的 socket_connect 作为客户端在本地连接到该服务。服务器使用 epoll 通过 Unix 套接字多路复用连接。使用 strstr() 解析用户提交的字符串以查找某些字符/单词,如果找到,则同时生成 4 个可连接线程到不同的网站。我使用套接字、连接、写入和读取,通过 TCP 在每个线程的端口 80 上与所述网络服务器进行交互。所有连接和写入似乎都是成功的。然而,对网络服务器套接字的读取失败,其中一个 (A) 所有 3 个线程似乎都挂起,只有一个线程返回 -1 并且 errno 设置为 104。响应线程需要大约 10 分钟 - 一个永恒的时间:-(。*我在某处读到 104(是 EINTR?),在网络上下文中表明...'连接已被对等方重置';或 (B) 来自 3 个线程的 0 个字节,并且 4 个线程中只有 1 个实际上返回了一些数据。套接字不是读/写线程安全的吗?我使用线程安全(和可重入)的 libc 函数,例如 strtok_r、gethostbyname_r 等。

*我怀疑上述虚拟主机实际上是在重置连接,因为当我运行单线程独立(其他一切都相同)时,所有事情都完美无缺,但当然是串联而不是并行。

还有第二个问题(哎呀),我无法回信给连接到我的 epoll-ed Unix 套接字的客户端。我的守护程序应用程序将永远挂起并占用 CPU > 100%。然而,没有任何东西写给客户端。确定客户端(一个非常典型的 PHP 套接字应用程序)在发生这种情况时没有关闭连接 - 也没有检测到错误。有任何想法吗?

即使使用 Valgrind、GDB 或大量日志记录,我也无法弄清楚有什么问题。请在力所能及的地方提供帮助。

0 投票
2 回答
1868 浏览

c++ - 处理 EINTR(使用 goto?)

背景:这是该线程关于在 C++ (Linux/GCC) 中处理系统调用的 EINTR的后续问题。无论我是否打算分析我的应用程序,似乎我都应该将系统调用设置errnoEINTR一种特殊情况。关于使用的意见有很多很多很多goto

我的问题:系统调用设置errno是否适用于被认为是名义上EINTR的情况?goto如果不是,那么您建议如何将以下代码转换为处理EINTR

提前致谢!
干杯,
-克里斯

更新:根据以下答案,我最终编写了以下宏:

用于将我的原始代码段转换为此示例:

希望这对其他人有帮助!

0 投票
4 回答
34314 浏览

linux - 何时检查 EINTR 并重复函数调用?

我正在为嵌入式 Linux 系统编写用户应用程序,并且正在为设备使用常用功能,例如打开、关闭、读取、ioctl 等。现在,我阅读了有关 EINTR 的信息,表明该函数被信号中断,但我不确定其含义。在我拥有的所有示例程序中,有时它已经完成,例如ioctl(),有时它没有完成,例如read()。所以,我有点困惑。

我什么时候最好检查 EINTR 并重复函数调用?

0 投票
1 回答
974 浏览

python - Python 在 Linux 中选择和处理 EINTR 的任何解决方法?

在我最近的一个项目中,我碰巧在同一个进程中(一个 Python 程序,它是一个多线程应用程序):

  • 一个 Boost::Python 模块到一个链接到AVT PvAPI SDK的库,即从最广泛的意义上说,驱动程序从相机获取图像帧。这个库(PvApi SDK)每隔几毫秒在内部生成一个SIGALRM 。

  • 另一个普通的 Python 模块,旨在使用pyserial进行一些串行 I/O 。这反过来使用 Python 的包装器select.select到 POSIX selecterrno == EINTR每次信号由另一个模块产生时,结果都会被中断( )。

  • 在 Python 的time.sleep的任何调用中都可以观察到相同的问题。POSIX sleep,内部使用。

这些问题在 Windows 中显然不存在,因为 sleep 和 select 不会被那里的任何信号中断(根据文档)。这些问题在 C/C++ 中并不是什么大问题,因为如果调用被中断,您可以(并且应该)重新启动调用。

但是,由于 Python 实现(源代码/Modules/selectmodule.c)不处理这种情况(EINTR),我是否被迫实现自己的 C/C++ 串行驱动程序和睡眠功能以在 Python 中使用?或者为了这个项目离开 Python?由于 Python 使编程变得如此容易,我非常感兴趣,如果有人遇到过类似的问题并找到了一个很好的解决方法或简单的解决方法。现在我没有能力自己为 Python 模块制定必要的修复程序。或者也许我错过了其他选择?

有任何想法吗?

0 投票
0 回答
640 浏览

posix - TEMP_FAILURE_RETRY 和非阻塞套接字

我应该TEMP_FAILURE_RETRY在非阻塞套接字上使用包围库调用(可能会失败并将 errno 设置为 EINTR)吗?

0 投票
1 回答
347 浏览

python - python:来自 math 和 os 模块的函数被 EINTR 中断

我在三星 SoC s3c6410 (ARM11) 上有 linux 板。我使用 buildroot 构建 rootfs:Python 2.7.1,uClibc-0.9.31。Linux 内核:Linux buildroot 2.6.28.6 #177 Mon Oct 3 12:50:57 EEST 2011 armv6l GNU/Linux

我的应用程序是用 python 编写的,在某些 mysterios 条件下会引发以下异常:

1) 例外:

代码:

2) 例外:

代码:

关于应用程序的一些信息:它有 3-7 个线程,通过“串行”模块侦听串行端口,使用通过包含 directfb 的 c 扩展实现的 gui,我无法重现此异常,它们是不可预测的。

我在 python 中搜索了 EINTR 异常,但只发现 EINTR 只能发生在慢速系统调用和 python 的模块套接字、子进程和另一个已经是进程 EINTR 的情况下。那么在我的应用程序中会发生什么?为什么简单的数学函数调用可以随时中断程序,一点都不可靠。我只有建议:ulibc 错误、内核/硬件处理错误。但是这个建议并没有告诉我解决方案。

现在我围绕 os 模块中的一些函数创建了包装函数(在 EINTR 的情况下重新启动操作),但是包装数学模块会使执行时间增加 2 倍。还有一个问题:如果数学可以比其他模块也可以中断,那么如何获得可靠性?

PS我意识到库调用(例如对libm)不是系统调用,那么为什么我有“中断的系统调用”?

0 投票
2 回答
1767 浏览

signals - 阻塞函数和 EINTR

许多 POSIX 阻塞函数在出现信号时返回 EINTR。这个想法是信号处理程序首先设置一个标志(在 SIGINT 的情况下说“停止”标志),然后阻塞函数解除阻塞返回 EINTR 并且应用程序看到该标志并执行有序关闭(或其他)。

但是,对于一些阻塞函数,例如 pthread_mutex_lock 和 pthread_cond_wait,没有 EINTR 错误。

这背后的想法是什么?使用这些函数的应用程序应该如何处理信号(特别是 Ctrl+C)?

0 投票
3 回答
4645 浏览

c++ - 被信号中断的系统调用仍需完成

很多系统调用,比如close( fd )可以被信号打断。在这种情况下,通常-1返回并errno设置EINTR

问题是什么是正确的做法?说,我仍然希望fd关闭它。

我能想到的是:

有人可以提出更好/更优雅/标准的方法来处理这种情况吗?

更新:正如 mux 所注意到的,RESTART安装信号处理程序时可以使用 SA_ 标志。有人可以告诉我哪些功能可以保证在所有POSIX系统上都可以重新启动(不仅Linux)?

0 投票
3 回答
7986 浏览

nonblocking - EINTR 和非阻塞调用

众所周知,一些阻塞调用像readandwrite会返回 -1 并设置errnoEINTR,我们需要处理这个问题。

我的问题是:这是否适用于非阻塞调用,例如,将套接字设置为O_NONBLOCK

由于我读过的一些文章和资料说非阻塞调用不需要为此烦恼,但我没有找到关于它的权威参考。如果是这样,它是否适用于不同的实现?