微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Linux 2.6.x上fork和clock_gettime的交互

我需要监视包含分支的一段代码,并且要确认clock_gettime()被logging为适用于此scheme。

这是伪代码

starttime = clock_gettime() if (fork() == 0) { /* in the child */ endtime = clock_gettime() print "elapsed time is " endtime - starttime }

我可以find使用这种技术的示例代码,但是我担心在分叉期间时钟将被重置,然后减去endtime和starttime将是没有意义的。

fork()的这个描述提到重设一些定时器,但没有提到这些定时器如何与clock_gettime()相关。 通过省略,人们可以认为它没有受到影响,但是在依靠这种技术之前,我希望得到更多的保证。 http://man7.org/linux/man-pages/man2/fork.2.html

位图正在拉伸,而不是平铺

为什么iconv函数需要一个非const的缓冲区?

多核心处理器中的线程

Windows中的SOCK_PACKET

我是否需要为此代码添加同步?

我可以编写一个testing程序来找出发生的事情,但是我更感兴趣的是find关于什么被定义为正确行为的文档。

编辑:我打算使用CLOCK_PROCESS_cpuTIME_ID和CLOCK_MONOTONIC_RAW

编辑2:我可以看到在叉手册页,与时间(2)相关的cpu计数器被重置,但我看不到clock_gettime()计数器在哪里重置。 clock_gettime()使用times(2)计数器,我没有看到它在哪里被logging。 如果是这样的话,我会认为时间(2)将在clock_gettime手册页中被引用。

链接器返回“重定位在符号索引处具有无效符号…”

我的蹦床不会反弹(绕路,C ++,GCC)

将数据序列化代码从C ++ linux / mac移植到C ++窗口

如何使用套接字重叠I / O?

英特尔指令的LOCK前缀。 有什么意义?

如果您使用CLOCK_PROCESS_cpuTIME_ID ,那么正确的行为是子级中的endtime是一个小的,接近零的值,因为fork将子设置为零。 对于父母来说,这将是一个稍大于开始时间的值,但几乎相同。

这在fork(2) manpage中有很好的记录,这也是有意义的 – 你创建一个新的进程。 新进程当然不会消耗任何cpu时间。 毕竟这是一个新生的过程! 另一方面,父母已经消耗了明显的cpu,并继续这样做,没有很好的理由为什么它的计数器应该归零(这将是一个谎言)。

像CLOCK_REALTIME或CLOCK_MONOTONIC等其他时钟不会受到影响(前者可以独立于你分叉被特权用户修改,但后者不能)。

那也是按照常识告诉你的。 他们是全球性的计时员,如果分派一个新的进程(几乎所有的时间都在发生)干扰他们,那将是一场灾难。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐