问题描述
我必须以强顺序运行我的进程,子进程然后父进程,如果子进程被阻塞怎么办,如何阻止父进程?
[FunctionName("GetCars")]
public async Task<IActionResult> GetCars([HttpTrigger(AuthorizationLevel.Anonymous,"get",Route = "api/v1/id/{id}")] HttpRequest req,Guid id)
{
try
{
if (id == Guid.Empty)
{
_logger.LogError("Id is Empty");
}
var cars= _deviceService.GetCars(id);
return new OkObjectResult(cars);
}
catch (Exception ex)
{
_logger.LogError(ex,"Failed to Fetch Cars");
}
}
解决方法
Aaand 作为在循环中执行 waitpid()
和 WNOHANG
超时的活动 cpu-busy 循环的替代方案,您应该更喜欢以 cpu 空闲的方式实现它。>
不要从父级调用 wait
,而是启用 SIGCHLD
并使用计时器设置超时,然后调用 pause()
并使用 pause()
等待和调度来自信号的事件。甚至在 man 3 wait
中都有一个如何做的示例。
同样在 Linux 上,您可以使用 pidfd_open(pid,0)
并在超时的情况下调用 poll()
以获得 POLLIN
。
从您给出的评论来看:您不想阻止父级阻止被阻止的子级,这是由 wait()
完成的。相反,您不希望在 wait()
中阻止父级。
为此使用 waitpid()
。它接收第三个参数,其中可以包含 WNOHANG
。这将使 waitpid()
立即返回,而无需等待某个孩子更改其状态。但是,您需要实现某种循环,检查所需状态,可能还需要超时。
有关更多信息,请参阅文档。