【问题标题】:how and when -EINTR is set when linux system call is blockedlinux系统调用被阻止时如何以及何时设置-EINTR
【发布时间】:2013-12-16 09:52:54
【问题描述】:

如果系统调用被阻塞,进程状态被设置为TASK_INTERRUPTIBLE,并且进程被从运行队列中移除。 当一个信号被传递给该进程时,内核将该信号添加到待处理信号列表中并将进程状态设置为TASK_RUNNING。 并且当下次调用schedule() 时,将执行此过程。 我不明白的是,阻塞的系统调用究竟是如何将-EINTR 返回到用户空间的? 任何被阻塞的系统调用都可以返回-EINTR? 设置-EINTR的逻辑是信号处理代码还是系统调用本身? AFAIK 信号处理仅在返回用户空间之前发生,是这样吗? 在上下文切换期间是否发生信号处理? 请帮助我理解这一点。

【问题讨论】:

    标签: linux linux-kernel operating-system signals system-calls


    【解决方案1】:

    当进程再次运行时(即,当schedule() 返回时),驱动程序必须使用signal_pending() 函数检查这种情况,并中止它正在执行的操作并返回-EINTR 错误代码。

    许多系统调用可重新启动,也就是说,在被信号中断后,它们可以在不改变功能的情况下再次执行。 在这种情况下,它们会返回-ERESTARTSYS 而不是-EINTR,并且内核会在处理完信号后自动处理重启。

    例如,请参阅drivers/tty/serial/serial_core.c 中的函数uart_wait_modem_status,或使用EINTRERESTARTSYS 的任何其他地方。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-24
      • 2019-04-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多