当前位置: 首页 > 面试题库 >

什么时候以及如何中断系统调用?

耿敏达
2023-03-14
问题内容

这是成功的send()是“原子的”吗?,因为我认为它实际上实际上涉及系统调用,而不仅仅是在套接字上发送。

哪些系统调用可以被中断,何时中断,中断在哪里处理?我已经了解了SA_RESTART,但并不完全了解发生了什么。

  • 如果我在没有SA_RESTART的情况下进行系统调用,该调用是否可以被与我的应用程序无关但需要操作系统中止我的调用并执行其他操作的任何类型的中断(例如,用户输入)中断?还是仅被与我的过程直接相关的信号(CTRL + C,套接字关闭等)打断?

  • 设置SA_RESTART时,send()或任何其他“慢速”系统调用的语义是什么?它会一直阻塞直到我的所有数据传输完毕或套接字断开时,还是返回的数字小于send()参数中的计数?

  • 在哪里实施重新启动?操作系统是否知道我希望在发生任何中断时重新启动该调用,还是某个信号发送到我的进程然后由库代码处理?还是我必须自己做,例如将调用包装在while循环中,然后根据需要重试?


问题答案:

系统调用可以被任何信号打断,包括SIGINT(由CTRL-C生成),SIGHUP等信号。

SA_RESTART被设置时,一个send()将返回(与发送的计数),如果任何数据发送被接收到的信号之前,它会返回一个错误EINTR,如果一个发送超时被设置(如那些无法重新启动),否则send()将被重新启动。

系统调用重启是在内核的信号处理代码中实现的。系统调用-ERESTARTSYS在检测到未决信号(或等待被信号中断)后在内部返回,这导致信号处理代码将指令指针和相关寄存器恢复到调用前的状态,从而使syscall重复执行。



 类似资料:
  • 问题内容: 什么时候应该使用ThreadLocal变量? 如何使用? 问题答案: 一种可能的(并且是常见的)用法是,当你有一些不是线程安全的对象,但又希望避免同步对该对象的访问时(我正在看着你,SimpleDateFormat)。而是给每个线程自己的对象实例。 例如:

  • 问题内容: 我读包含在大括号关键字后的代码块中一个的上下文中流动,必须调用标有一个函数使用属性或传输控制,,或。 最后一部分很清楚,而第一部分我不太清楚。 首先,即使您未声明任何返回类型,任何函数都将返回某些内容(至少一个空元组)。其次,什么时候可以使用函数?文档是否建议一些标记为的内置内置方法? Guard语句的else子句是必需的,并且必须调用带有noreturn属性标记的函数,或者使用以下语

  • 我正在学习Vue JS,发现有时我们导入{},有时我们导入时没有{}。请问有什么区别? 非常感谢。

  • 问题内容: 在这个主题中,我问了一个有关Java垃圾收集的问题。但是我得到的答案又给了我一个问题。 有人提到垃圾回收器也可以收集类。这是真的? 如果是真的,这是如何工作的? 问题答案: 没有任何引用时,可以对Java中的类进行垃圾回收。在大多数简单的设置中,这永远不会发生,但是在某些情况下可能会发生。 有很多方法可以使类可达,从而阻止其符合GC的资格: 该类对象仍然可以访问。 表示类的对象仍然可以

  • 问题内容: 我的用户空间应用程序有时会在收到EINTR信号后以某种方式阻塞。 我用strace记录的内容: 我可以捕获EINTR信号吗,如何重复有关的调用,例如写入,读取或选择?即使使用与系统调用一起使用的第三方库,我如何确定EINTR发生在哪里? 为什么收到EINTR后我的应用程序被完全阻止(请参阅strace转储:我发送了SIGUSR1,通常应该处理)?为什么futex()将ERESTARTS

  • 问题内容: 我无法理解hibernate何时进入二级缓存以及何时使缓存失效。 这是我目前所了解的: 第二级缓存在会话之间存储实体,作用域为SessionFactory 您必须告诉要缓存的实体,默认情况下不会缓存任何实体 查询缓存将查询结果存储在缓存中。 我不明白的是 hibernate何时会命中此缓存? 假设我已经设置了二级缓存,但没有设置查询缓存。我想缓存我的客户,其中有50000。我可以通过哪