linux - 信号如何中断系统调用

标签 linux signals ipc

我在读一篇文章,我读到以下内容:假设我们要执行一个外部命令并等待它退出。我们不想永远等待,我们想设置一些超时时间,之后我们将终止子进程。这个怎么做?要运行命令,我们使用 fork(2) 和 execve(2)。要等待特定进程退出,我们可以使用 waitpid(2) 函数,但它没有超时参数。我们还可以创建一个循环,在该循环中以超时作为参数调用 sleep(3),并利用 sleep(3) 将被 SIGCHLD 信号中断的事实。该解决方案将起作用……几乎。它将包含一个竞争条件:如果进程立即退出,在我们调用 sleep(3) 之前我们将等到超时到期。这是一场类似于前面描述的比赛。 系统调用是如何中断的?子进程是否将信号发送给父进程或系统调用 sleep(3)?我不明白系统调用如何停止执行并传递给父进程,系统调用是否像另一个进程?

最佳答案

How is the system call interrupted? does the child send the signal to the parent process or the the system call sleep(3)?

当子进程执行系统调用exit(2)时,内核函数do_exit() ,从那里exit_notify()从那里do_notify_parent()被调用,它将 SIGCHLD 发送到父级并调用 __wake_up_parent()

I don't get how the system call stop execution and passes to the parent process, is the system call like another process?

底层系统调用 sleep() 将调用进程置于 TASK_INTERRUPTIBLE 状态 - 参见 e。 G。 Sleeping in the Kernel .之后,进程不会被调度,直到被上面的 __wake_up_parent() 或超时唤醒。

关于linux - 信号如何中断系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37766771/

相关文章:

unix - 是否可以选择是否即时生成堆转储?

c - 在不相关的进程之间设置IPC

java - 2个Java项目之间的线程间通信

linux - 无法在 Unix 中捕获 SIGQUIT 信号

协调/控制多个 C 应用程序

linux - 将命令输出保存在保留换行符的字符串变量中

django - 无法通过管道从 python 命令输出

c - 从用户区读取 32k i2c eeprom

C - 创建 n 个线程

子进程可以 <defunct> 而父进程不死吗?