首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >进程在启动时如何查询?

进程在启动时如何查询?
EN

Stack Overflow用户
提问于 2014-10-15 20:02:29
回答 3查看 858关注 0票数 1

是否有一个呼叫,可以用来询问操作系统,什么时候开始当前进程?

当然,我们可以简单地在启动时调用gettimeofday(),并在整个过程中引用这个曾经记录过的值,但是还有其他选择吗?

显然,操作系统保存每个进程的记录(例如,可以在ps的输出中看到它)。它是否可以由进程本身来查询(使用C)?

一个理想的解决方案,当然,是跨平台的,但某些(免费的)特定的BSD也是可以的。谢谢!

更新:我想出了一个特定于BSD的实现,它使用sysctl(3)获取当前流程的kern_proc结构,并在其中找到ki_start字段。如果几天后没有人提出更好的建议,我会在这里为后人张贴我自己的功能.

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-05 08:00:31

不确定这是FreeBSD以外的BSD的标准(仅在FreeBSD 10.0,amd64上测试)。除了使用系统库之外,它还完成了与Mikhail .的解决方案相同的工作。尽管如此,代码还是相当粗糙(因为‘不应该太难了’,所以我不得不想出正确的方法。2+几个小时后,这就是我所拥有的。效果很好。

请记住使用-lkvm标志编译libkvm (内核数据库)。kinfo_proc在/usr/include/sys/user.h中有详细的内容,并且提供了您想要了解的有关进程的一些信息。下面的示例代码使用当前进程,但它只是基于PID提取信息。在我的代码片段中,您需要提取流程的环境变量和其他内容,如果需要,只需告诉我即可。

代码语言:javascript
复制
#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)可以在这里找到:信息

票数 1
EN

Stack Overflow用户

发布于 2014-10-15 20:08:13

您可以查看/proc/[process-id]文件夹。在上面做一个fstat()来获取更多的信息。

票数 1
EN

Stack Overflow用户

发布于 2014-10-21 12:46:13

好的,这是我自己的函数--它在FreeBSD上工作,很可能在Open.NET和DragonFly BSD上工作。也许,在MacOS上也是如此。可以随意选择并调整以适应口味--函数将值缓存在一个静态变量中,这意味着,如果您的流程在函数被调用一次之后分叉,子函数将具有父级值。另外,我放弃了timeval的微秒部分,但您可能需要它。

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26391097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档