是否有一个呼叫,可以用来询问操作系统,什么时候开始当前进程?
当然,我们可以简单地在启动时调用gettimeofday(),并在整个过程中引用这个曾经记录过的值,但是还有其他选择吗?
显然,操作系统保存每个进程的记录(例如,可以在ps的输出中看到它)。它是否可以由进程本身来查询(使用C)?
一个理想的解决方案,当然,是跨平台的,但某些(免费的)特定的BSD也是可以的。谢谢!
更新:我想出了一个特定于BSD的实现,它使用sysctl(3)获取当前流程的kern_proc结构,并在其中找到ki_start字段。如果几天后没有人提出更好的建议,我会在这里为后人张贴我自己的功能.
发布于 2014-11-05 08:00:31
不确定这是FreeBSD以外的BSD的标准(仅在FreeBSD 10.0,amd64上测试)。除了使用系统库之外,它还完成了与Mikhail .的解决方案相同的工作。尽管如此,代码还是相当粗糙(因为‘不应该太难了’,所以我不得不想出正确的方法。2+几个小时后,这就是我所拥有的。效果很好。
请记住使用-lkvm标志编译libkvm (内核数据库)。kinfo_proc在/usr/include/sys/user.h中有详细的内容,并且提供了您想要了解的有关进程的一些信息。下面的示例代码使用当前进程,但它只是基于PID提取信息。在我的代码片段中,您需要提取流程的环境变量和其他内容,如果需要,只需告诉我即可。
#include <fcntl.h>
#include <kvm.h>
#include <sys/sysctl.h>
#include <sys/user.h>
#include <unistd.h>
#include <stdio.h>
#include <time.h>
int main(int argc,char** args) {
kvm_t* kd;
// Get a handle to libkvm interface
kd = kvm_open(NULL, "/dev/null", NULL, O_RDONLY, "error: ");
pid_t pid;
pid = getpid();
struct kinfo_proc * kp;
int p_count;
// Get the kinfo_proc for this process by its pid
kp = kvm_getprocs(kd, KERN_PROC_PID, pid, &p_count);
printf("got %i kinfo_proc for pid %i\n", p_count, pid);
time_t proc_start_time;
proc_start_time = kp->ki_start.tv_sec;
kvm_close(kd);
printf("Process started at %s\n", ctime(&proc_start_time));
return 0;
}编辑
完整的源代码,例如FreeBSD、NetBSD和Mac (当我有机会的时候OpenBSD)可以在这里找到:信息
发布于 2014-10-15 20:08:13
您可以查看/proc/[process-id]文件夹。在上面做一个fstat()来获取更多的信息。
发布于 2014-10-21 12:46:13
好的,这是我自己的函数--它在FreeBSD上工作,很可能在Open.NET和DragonFly BSD上工作。也许,在MacOS上也是如此。可以随意选择并调整以适应口味--函数将值缓存在一个静态变量中,这意味着,如果您的流程在函数被调用一次之后分叉,子函数将具有父级值。另外,我放弃了timeval的微秒部分,但您可能需要它。
static void
getstarttime(struct timeval *ptv)
{
static time_t start; /* We cache this value */
int mib[4];
size_t len;
struct kinfo_proc kp;
ptv->tv_usec = 0; /* Not using microseconds at all */
if (start != 0) {
ptv->tv_sec = start;
return;
}
ptv->tv_sec = 0;
len = 4;
if (sysctlnametomib("kern.proc.pid", mib, &len) != 0) {
warn("Unable to obtain script start-time: %s",
"sysctlnametomib");
return;
}
mib[3] = getpid();
len = sizeof(kp);
if (sysctl(mib, 4, &kp, &len, NULL, 0) != 0) {
warn("Unable to obtain script start-time: %s",
"sysctl");
return;
}
start = ptv->tv_sec = kp.ki_start.tv_sec;
}https://stackoverflow.com/questions/26391097
复制相似问题