【问题标题】:User CPU time of specific child process after first output to stdout首次输出到标准输出后特定子进程的用户 CPU 时间
【发布时间】:2012-01-11 01:52:59
【问题描述】:

我正在开发一个可能会产生多个子进程的程序,我需要获取每个子进程使用的 CPU 时间的准确信息,即使有多个子进程同时运行。我在父进程的单独线程上使用 wait4(2) 来执行此操作,效果很好。

但是,这种方法提供了特定子进程所花费的总时间,我只对特定事件之后花费的时间量感兴趣,即子进程的第一次输出到标准输出。我研究了获取子进程 CPU 时间的其他方法,例如 getrusage(2) 和 times(3),但这些似乎无法区分多个子进程的时间,而是提供所有子进程的时间总和。

我正在开发一个文本编辑器应用程序,它允许用户以各种不同的语言运行脚本和代码,并且该应用程序具有内置的代码计时功能。该应用程序依赖 bash 脚本来运行用户代码,而我的 bash 脚本所做的第一件事就是输出一个开头字节 (0x02)。在此之后,bash 脚本会执行运行用户代码所需的任何操作,这就是我想要做的事情。 Bash 可能会做一些初始化(设置 PATH 变量等),这可能需要 30 或 40 毫秒才能完成,我不希望初始化与其余部分一起计时。例如,如果用户代码是 C 语言中的简单 Hello World 类型程序,则计时功能可能会显示类似 41 毫秒的时间,而不是实际运行代码所需的 1 毫秒。

关于如何做到这一点的任何想法?

谢谢:)

【问题讨论】:

    标签: c unix time process fork


    【解决方案1】:

    我想到了几个可能的解决方案。它们在第一次输出后不会获得 CPU 时间,但它们可能会避免您正在处理的问题。

    首先是摆脱 bash 脚本,在运行用户代码之前在程序中执行相同的工作(例如,在 fork()exec() 之间)。这样wait4() 的子进程的 CPU 时间不包括您的额外设置。

    另一种可能性是编写一个简单的应用程序,它只运行用户的应用程序并将其 CPU 时间报告回您的主应用程序。然后可以从您的脚本调用该运行程序应用程序来运行用户的程序,而不是直接调用用户的程序。 runner 应用程序本身可能使用fork()/exec()/wait4() 来运行用户的程序,并可以通过命名管道、消息等多种方式将来自wait4() 的信息报告给主程序队列、套接字,甚至只是将信息写入主程序之后可以打开的文件。这样一来,您的 bash 脚本就可以在运行用户程序之前和之后工作,这些工作不会包含在运行程序应用程序报告的 CPU 时间中。除了用户程序的路径和参数之外,您可能希望运行器接受诸如管道名称或输出文件之类的参数,以便您可以控制信息的报告方式——这样您就可以运行多个runner 应用程序的实例,并且仍然将它们报告的信息分开。


    如果您确实想要包含脚本完成的工作,而不是加载 bash 所花费的时间,那么您可以通过从 bash 向管道回显某些内容来向主程序发出信号您想要计时的部分之前和之后的脚本。然后主程序可以测量开始和停止信号之间的时间,这至少可以让您获得挂钟时间(尽管不是实际的 CPU 时间)。否则,我不确定是否有一种方法可以在不使用修改过的 bash 的情况下完美地测量部分脚本的 CPU 时间(如果可能的话,我会避免使用)。

    【讨论】:

    • 感谢您提供如此好的答案。我希望有一种简单的方法来做我错过的我需要的事情,但我想没有..您创建一个简单的应用程序来完成计时工作的想法听起来可能会奏效,我会给试试看效果如何。
    猜你喜欢
    • 2011-08-29
    • 1970-01-01
    • 2012-04-26
    • 2016-02-29
    • 1970-01-01
    • 2015-06-15
    • 2013-06-02
    • 1970-01-01
    • 2013-07-16
    相关资源
    最近更新 更多