- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我发现这段代码被使用了好几次(还有一个类似的代码,它使用 open()
而不是 write()
)。
int c = write(fd, &v, sizeof(v));
if (c == -1 && errno != EINTR) {
perror("Write to output file");
exit(EXIT_FAILURE);
}
这里为什么检查if && errno != EINTR
?
在 man 上寻找 errno
我发现了以下关于 EINTR
的文本,但即使我访问了 man 7 signal
这并没有启发我。
EINTR Interrupted function call (POSIX.1); see signal(7).
最佳答案
如果在系统调用过程中出现信号,许多系统调用将报告EINTR
错误代码。实际上并没有发生错误,只是这样报告的,因为系统无法自动恢复系统调用。这种编码模式只是在发生这种情况时重试系统调用,以忽略中断。
例如,如果程序在计时器用完时使用 alarm()
异步运行某些代码,则可能会发生这种情况。如果在程序调用 write()
时发生超时,我们只想重试系统调用(也称为读/写等)。
关于检查是否 errno != EINTR : what does it mean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41474299/
许多 POSIX 阻塞函数在有信号的情况下返回 EINTR。这个想法是信号处理程序首先设置一个标志(在 SIGINT 的情况下说“停止”标志),然后阻塞函数取消阻塞返回 EINTR,并且应用程序看到该
如果读取大量数据,是否需要检查errno == EINTR?我使用 pread() 函数来读取。在我的一生中,我从未见过 EINTR 返回,但我在网上看到了一些代码,其中明确地检查了它。 那么真的有必
tl;博士 在 Python 中读取管道时,我是否应该处理 EINTR“系统调用中断”错误?如果是,我该如何测试此类代码? 描述 在下面的回溯中,self._dataq 是一个 multiproces
我正在运行一个 epoll 循环,有时我对 epoll_wait 的调用返回 -1,errno 设置为 EINTR。有时,我希望这样可以结束 epoll 循环,例如 SIGTERM 或 SIGINT。
简而言之,您如何对系统调用中的 EINTR 等错误条件进行单元测试。 我正在处理的一个特定示例(它本身可能就是一个案例)是当 fclose 返回带有 (errno==EINTR) 的 EOF 时是否有
我看到了处理 EINTR 错误的代码(读、写系统调用)。我了解中断发生在两种情况下。首先,它发生在调度的每个时间片上。其次,它是通过信号发生的。但是 stackoverflow 中的每个人都说只是信号
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
在我的程序中,我有一个系统调用“sendmsg()”。我想测试如果这个系统调用被中断会发生什么。我应该怎么做? int test(args) { ----- /
我有一个线程负责轮询各种fds。我正在使用设置了超时的 epoll_wait。以下是代码片段: do { n = epoll_wait(epollFd, eventsList, eventsT
我研究发现用socket编程时会出现信号中断的情况。我搜索了一下,发现如果信号中断,我们应该重试。也就是说,我必须捕获错误并重试。我必须像这样创建套接字。 int create_sock() {
有没有专家可以帮助我解决以下问题? 我在 C 中有以下系统调用: access() unlink() setsockopt() fcntl() setsid() socket() bind() lis
来自 man -e 2 wait : The call wait(&status) is equivalent to: waitpid(-1, &status, 0); 错误号值: EINTR WNO
使用 timer_create,我们向等待 select 函数的线程发送实时信号。 这个信号在线程中被捕获和处理。基于事实,当捕获到信号时,选择将被中断,如果 select 失败并显示错误号 EINT
我发现这段代码被使用了好几次(还有一个类似的代码,它使用 open() 而不是 write())。 int c = write(fd, &v, sizeof(v)); if (c == -1 && e
我正在为嵌入式 Linux 系统编写用户应用程序,并且我正在为设备使用诸如打开、关闭、读取、ioctl 等常用功能。现在,我阅读了有关 EINTR 的信息,表明该函数被信号中断,但我不确定其含义。在我
有一些系统调用支持的 I/O 函数(我最近发现至少两个:stat() 和 mkdir() 但几乎可以肯定还有更多)根据 POSIX,可能的 errno 值中没有 EINTR,但肯定可能由于磁盘繁忙或网
在规范和两个实现中: 根据 POSIX,dup2()可能返回 EINTR。 linux 手册页将其列为允许的。 FreeBSD 手册页表明它从未返回。这是一个错误吗 - 因为它的紧密实现可以 EINT
到目前为止我的网络代码工作正常,但我有点担心我隐藏在地毯下的东西: accept、close、connect、recv 和 send 的手册页> 提到 errno.EINTR 可以在系统调用被信号中断
注意: This question与我的相当接近,但我至少可以对提供的解决方案使用一些工作示例,也许 ZeroMQ 会带来一些我不知道的魔力。 目前,我在阻止 ZeroMQ 调用时对异常使用react
我是信号量的新手,想在我的程序中添加多线程,但我无法解决以下问题:只要我没有设置 SA_RESTART,sem_wait() 应该能够接收 EINTR 并解锁旗帜。我正在向在 sem_wait() 中
我是一名优秀的程序员,十分优秀!