2012-11-20 30 views
1

我正在使用Solaris。使用procf知道进程状态/ <pid> /状态

我知道如果有一个进程正在运行,有一个文件叫做/proc/<PID>/status,其中<PID>是进程ID,它包含一个名为state的字段。

举个例子,我用我的外壳工艺:

> ps 
    PID TTY   TIME CMD 
18671    0:01 tcsh 

其进程ID是18671.

我写了一个简单的C程序中提取信息:

#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/procfs.h> 
#include <sys/fcntl.h> 

static void get_status (pid_t pid) 
{ 
    char procpath[100]; 
    char buf[100]; 
    int pfd; 
    char State[100]; 
    char Name[100]; 
    prstatus_t * pms; 
    FILE *proc; 


    sprintf(procpath, "/proc/%d/status", pid); 

    proc = fopen(procpath,"r"); 
    if (proc) { 
     printf("Open Successful\n"); 
     fgets(buf,256,proc); sscanf(buf,"Name:\t%s",Name); 
     fgets(buf,256,proc); sscanf(buf,"State:\t%c",State); 
     } 
    printf("%s",Name); 
    printf("%s",State); 
} 

int main(int argc, char **argv) 
{ 
    get_status(18671); 

} 

它不会产生任何输出:

> ./a.out 
Open Successful 
> 

procfs的在线资料说我们可以简单地在proc/<pid>/status上做一个猫并检查过程的状态。

但在我的情况下,这是一个二进制文件。我从来没有在任何地方看到它是二元的。

有没有一种方法可以使用简单的C程序来获取当前进程的状态?

C++解决方案也是可以接受的。

+1

所有的Unix有不同的/ proc文件系统(当它们有一个时)。看起来您在运行Solaris时正在使用有关Linux/proc的信息。请参阅http://docs.oracle.com/cd/E23824_01/html/821-1473/proc-4.html#REFMAN4proc-4 for Solaris。 – Mat

+0

是啊,你是对的...可能linux有一个不同的实现。但我怎么能在solaris做同样的事情,我将使用文件/proc/PID/status.Is那里没有办法,我可以检查状态字段来自procfs.Can的状态文件任何人都至少给我提示如何解码其中的值?至少是一个小例子! – Vijay

+0

阅读我链接到上面的文档。它描述了Solaris上proc文件的格式。 – Mat

回答

3

这是你应该读出的/ proc/pid /状态的结构:

typedef struct pstatus { 
     int  pr_flags;  /* flags (see below) */ 
     int  pr_nlwp;  /* number of active lwps in the process */ 
     pid_t pr_pid;   /* process id */ 
     pid_t pr_ppid;  /* parent process id */ 
     pid_t pr_pgid;  /* process group id */ 
     pid_t pr_sid;   /* session id */ 
     id_t pr_aslwpid;  /* historical; now always zero */ 
     id_t pr_agentid;  /* lwp id of the /proc agent lwp, if any */ 
     sigset_t pr_sigpend; /* set of process pending signals */ 
     uintptr_t pr_brkbase; /* address of the process heap */ 
     size_t pr_brksize;  /* size of the process heap, in bytes */ 
     uintptr_t pr_stkbase; /* address of the process stack */ 
     size_t pr_stksize;  /* size of the process stack, in bytes */ 
     timestruc_t pr_utime; /* process user cpu time */ 
     timestruc_t pr_stime; /* process system cpu time */ 
     timestruc_t pr_cutime; /* sum of children's user times */ 
     timestruc_t pr_cstime; /* sum of children's system times */ 
     sigset_t pr_sigtrace; /* set of traced signals */ 
     fltset_t pr_flttrace; /* set of traced faults */ 
     sysset_t pr_sysentry; /* set of system calls traced on entry */ 
     sysset_t pr_sysexit; /* set of system calls traced on exit */ 
     char pr_dmodel;  /* data model of the process (see below) */ 
     char pr_pad[3]; 
     taskid_t pr_taskid;  /* task id */ 
     projid_t pr_projid;  /* project id */ 
     int  pr_nzomb;  /* number of zombie lwps in the process */ 
     zoneid_t pr_zoneid;  /* zone id */ 
     int  pr_filler[15]; /* reserved for future use */ 
     lwpstatus_t pr_lwp;  /* status of the representative lwp */ 
} pstatus_t; 

注意它的头文件procfs.h定义。声明一个pstatus_t变量并将sizeof(pstatus_t)字节读入该变量。

提示:也可通过ls获得,您还可以使用/proc/self/psinfo来阅读自我过程的psinfo。