【问题标题】:exec family function in C [closed]C中的exec族函数[关闭]
【发布时间】:2016-09-20 17:32:24
【问题描述】:

正如我们所知,exec 系列函数调用最终会调用execve(),这是一个系统调用,其余的是库函数。因此,通常情况下,适用于 execve() 的任何含义也适用于其他 exec*() 函数。

我想知道在执行execve() 期间是否所有信号都被阻塞直到它成功,或者是否有办法将信号传递给对应于exec 的pid? (我知道它不会返回成功并且调用函数的进一步执行不会发生)

【问题讨论】:

  • 不确定您的要求;你能提供一些伪代码来说明你的要求吗?
  • @csl 我的问题很简单直接,execve(或任何 exec 函数)会阻塞所有信号直到它完成吗?

标签: c linux


【解决方案1】:

我不确定我的问题是否正确,如果我错了,请随时纠正我。

但是,基本上,是的,从进程的角度来看,系统调用可以被视为“原子”。因此,一旦启动 execve() 系统调用,只有内核可以处理它,并且它不会释放进程,直到运行新命令或失败并出现错误代码或引发 SIGKILL 信号(如 @987654323 @ 是唯一不可阻挡的信号)。

但是,一旦execve() 产生了一个新进程(并从内核返回),它完全可以被任何信号中断。

【讨论】:

  • 我的问题很简单直接,execve(或任何 exec 函数)会阻塞所有信号直到它完成吗?
  • 是的。因为它位于内核空间(而不是用户空间)。
  • 那么如何结束/杀死被卡住(挂起)的 exec 函数而不从其他上下文中杀死它的进程 ID?
  • 一个进程在启动时不太可能卡在内核域中......因此,如果它挂起,可能是在程序启动后,你应该能够用 @ 杀死它987654325@ 与任何其他进程一样。
  • 例如,像 bdf(在 hpux 或 df 在 linux 中)这样的进程在完成输出之前不会超时。现在,如果有任何 nfs 文件系统没有响应(nfs 服务器),那么当 bdf 尝试访问没有响应的 nfs 服务器时,它会挂起并且永远不会超时,因此要杀死它,您可以从另一个终端终止 bdf 的进程(命令线)。我试图从 C 程序运行 bdf 并传递信号(警报),该信号将在 n 秒后终止(n 是警报函数的参数),但是由于警报发送 SIGALRM,它被阻塞直到 bdf(通过 exec)完成。
猜你喜欢
  • 1970-01-01
  • 2021-01-03
  • 2016-04-30
  • 2016-07-07
  • 2011-05-11
  • 2020-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多