从非儿童过程中获取退出代码

问题描述 投票:0回答:2
GetExitCodeProcess

的Windows类似物。在Windows中,我们可以通过调用

OpenProcess

然后直接使用返回的句柄来打开进程。因此我们可以调用

GetExitCodeProcess

功能并检索状态。 linux中有同样的东西用于使用non-Child流程?


    
	

没有POSIX或其他标准的Unix / Linux呼叫来做您所知道的,但是您可以使用Procfs在Linux(或其他Unix)上完成它。许多非标准的扩展是通过procfs。

如果父母尚未等待孩子,返回代码可能仍在附近。 见: linux,系统守护程序和其他过程的返回代码在哪里?

c++ linux windows process
2个回答
1
投票
有几种方法,每个方法都有自己的警告。最初,我试图根据适合您和我分享的非常任意的标准将它们从“最佳”对“最差”进行排名内核 - 不存在,因此它们以随机顺序呈现。以下是您明确提到或可能受益的标准,这些标准来自以下标准:

我可以找出是否退出了一个过程?

(这是势在必行的)

方法跨平台?


0
投票

我能发现它被信号(

SIGTERM
  • SIGKILL等)杀死吗? 注:您没有提及这一点,但是如果您想知道该过程如何退出,则返回代码并不是唯一要考虑的事情!
  • 将告诉我是否在终止后进行了核心转储?也没有明确提及,但出于与上述相同的原因很重要
  • 如果我只是想获取我启动的流程的退出状态,则需要特别特权。
    
    如果是的,除了将其作为根以外的其他东西以外,还可以用来获得这些特权吗?例如,Linux,例如,可以做到这一点
    
    它是在支持的平台上记录的?
  • -prace 一种实现这一目标的非常侵入性的方法是
  • setcap
  • 。但是,在大多数系统上,您不仅可能需要根,而且实现非常不一致。参见,例如,thisRepository,其中说:
    • ptrace
      在Linux上很棒。它很简单,功能性且易于使用。 
      ptrace
      在MacOS上不是。
  • 在OSX上,我能够使用Ptrace的
  • ptrace
  • (停止过程)附加到该过程,然后使用
PTRACE_ATTACH

等待它,然后发送PTRACE

waitpid

消息(继续),然后再次等待(直到退出)。我没想到这会起作用,但确实可以,我可以获得回报状态。

PTRACE_CONT
应该仅用于儿童过程。我相信这种行为是没有证件的。它可能适用于其他类似BSD的系统。不幸的是,即使过程是您自己的,它也需要根。 Kqueud BSD系统上的其他方法正在使用Kqueue。您需要waitpid

事件过滤器和过滤器标志
EVFILT_PROC

。有关详细信息,请参见Kqueue

上的人页面。只要我只是尝试监视我启动的流程,我就会成功地将其用于MACOS。这实际上可以很好地工作并检查了许多框,但它不是完全跨平台(没有Linux支持),并且只能为您提供退出状态。您找不到有关核心转储或引起终止信号的信息。
NETLINK

Cn_proc.c
中的Linux内核中实现。 Netlink用于使用套接字直接与用户空间的内核进行通信。 @@Agile解释了您需要知道的内容。不幸的是,NetLink是Linux功能,没有跨平台兼容性。可以在github

上的Stormc的Waitforpid存储库中找到所有收集所有重要数据(包括哪个信号导致过程终止的示例)
主要方法(procfs/信号)
ProCFS不是一个好的解决方案,因为一旦流程退出,返回代码(以及代表PID的其余部分)就消失了。但是,在紧急情况下,您可以进行轮询或使用
NOTE_EXIT
(确实在procfs上使用!)至少弄清楚该过程何时退出。您可以通过向流程发送
inotify
信号来做同样的事情,如果成功,它仍然活着。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.