home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / zip / mint / mntutl95.lzh / MNTUTL95 / PS.C < prev    next >
C/C++ Source or Header  |  1993-08-03  |  5KB  |  192 lines

  1. /*
  2.  
  3.   ps.c: a program to print MiNT process statuses
  4.  
  5.   
  6.   Coded: 3/24/1991 by Tony Reynolds, cctony@sgisci1.ocis.olemiss.edu
  7.   For use with: MiNT release 0.7
  8.   Updated: 3/29/1991 by Eric Smith for MiNT version 0.8
  9.   Updated again 8/9/1991 by ERS for MiNT 0.9.
  10.   Updated some more 11/91 by AKP (shows process time in fractions of a sec).
  11. */
  12.  
  13. #include <stdio.h>
  14. #include <osbind.h>
  15. #include <errno.h>
  16. #include <basepage.h>
  17. #include <ioctl.h>
  18. #include <string.h>
  19. #include <stdlib.h>
  20. #include <unistd.h>
  21.  
  22. #ifndef PCTXTSIZE
  23. #define PCTXTSIZE (('P'<<8) | 3)
  24. #endif
  25.  
  26. #define ulong unsigned long
  27.  
  28. struct status {   /* defines values for internal->external process states */
  29.   int mint;       /* what MiNT knows */
  30.   char desc[10];  /* a textual description for above */
  31. } proc_stat[] = {
  32.   0,    "Ready",
  33.   0x01, "Ready",
  34.   0x20, "Wait ",
  35.   0x21, "Sleep",
  36.   0x22, "Exit ",
  37.   0x02, "TSR  ",
  38.   0x24, "Stop ",
  39.   -1,    "Unkn "
  40.  };   /* initialized from data in procfs.c */
  41.  
  42. extern int __mint;
  43.  
  44. typedef struct _context {
  45.     long    regs[15];    /* registers d0-d7, a0-a6 */
  46.     long    usp;        /* user stack pointer (a7) */
  47.     short    sr;        /* status register */
  48.     long    pc;        /* program counter */
  49.     long    ssp;        /* supervisor stack pointer */
  50.     long    term_vec;    /* GEMDOS terminate vector (0x102) */
  51.  
  52. /* these fields were added in MiNT 0.9 */
  53.     char    fstate[216];    /* FPU internal state */
  54.     char    fregs[12*8];    /* registers fp0-fp7 */
  55.     long    fctrl[3];        /* FPCR/FPSR/FPIAR */
  56.     short    sfmt;            /* stack frame format identifier */
  57.     long    iar;            /* instruction address */
  58.     short    internal[4];    /* four words of internal info */
  59. } CONTEXT;
  60.  
  61. struct pinfo {
  62.     long    magic;
  63.     char    *base;
  64.     short    pid, ppid, pgrp;
  65.     short    ruid, rgid;
  66.     short    euid, egid;
  67.     short    memflags;
  68.     short    pri;
  69.     short    wait_q;
  70.     long    wait_cond;
  71.     /* (all times are in milliseconds) */
  72.     ulong    systime;        /* time spent in kernel        */
  73.     ulong    usrtime;        /* time spent out of kernel    */
  74.     ulong    chldstime;        /* children's kernel time     */
  75.     ulong    chldutime;        /* children's user time        */
  76.  
  77.     ulong    maxmem;            /* max. amount of memory to use */
  78.     ulong    maxdata;        /* max. data region for process */
  79.     ulong    maxcore;        /* max. core memory for process */
  80.     ulong    maxcpu;            /* max. cpu time to use     */
  81.  
  82.     short    domain;            /* process domain (TOS or MiNT)    */
  83.     short    curpri;            /* current priority (nice)    */
  84. };
  85.  
  86. /* open the process named "name" */
  87. int
  88. open_proc(name)
  89.   char *name;
  90. {
  91.   static char pname[] = "u:\\proc\\xxxxxxxx.xxx";
  92.  
  93.   strcpy(pname+8, name);
  94.   return open(pname, 0);
  95. }
  96.  
  97. void
  98. main(argc, argv)
  99.   int argc;
  100.   char **argv;
  101. {
  102.  
  103.   _DTA mydta;
  104.   int fd;
  105.   int fserror=0;
  106.   long place;
  107.   short pid, ppid, pri, curpri;
  108.   char *cmdline;
  109.   struct status *statp;
  110.   long ctxtsize;
  111.   BASEPAGE bpage;        /* process basepage read in here if possible */
  112.   struct pinfo proc;        /* process info read in here */
  113.   long ptime;
  114.   long hour, min, sec, frac;
  115.  
  116.   Fsetdta(&mydta);          /* give the OS my new DTA */
  117.  
  118.   fserror=Fsfirst("u:\\proc\\*.*", 0x27);
  119.   if (fserror < 0) {
  120.     fprintf(stderr, "ps: cannot list processes, MiNT may not be running\n");
  121.     exit(1);
  122.   }
  123.  
  124.   printf("PID  PPID PRI CURPRI STATUS   SIZE    TIME    COMMAND\n");
  125.  
  126.   /* okay, now run the Fsnext bit through the wringer */
  127.  
  128.   fserror = E_OK;       /* set up for the loop */
  129.  
  130.   while (fserror == E_OK ) {
  131.     fd = open_proc(mydta.dta_name);
  132.  
  133.     for (cmdline = mydta.dta_name; *cmdline && *cmdline != '.'; cmdline++) ;
  134.     *cmdline = 0;
  135.  
  136.     if (fd < 0) goto next;
  137.  
  138.     ioctl(fd, PPROCADDR, &place);
  139.     if (ioctl(fd, PCTXTSIZE, &ctxtsize) < 0) {
  140.     lseek(fd, place+4+2*sizeof(CONTEXT), 0);
  141.     } else
  142.         lseek(fd, place, 0);
  143.     read(fd, &proc, sizeof(proc));
  144.     if ((pid = proc.pid) < 0) pid = 0;
  145.     if ((ppid = proc.ppid) < 0) ppid = 0;
  146.     pri = proc.pri;
  147.     curpri = proc.curpri;
  148.     ptime = proc.systime + proc.usrtime;
  149.     hour = (ptime/1000/60/60);
  150.     min = (ptime/1000/60)%60;
  151.     sec = (ptime/1000)%60;
  152.     frac = (ptime%1000) / 10;    /* (never anything in .001 digit) */
  153.  
  154.     ioctl(fd, PBASEADDR, &place);
  155.     lseek(fd, place, 0);
  156.     read(fd, &bpage, sizeof(bpage));
  157.     cmdline = bpage.p_cmdlin;
  158.     if (*cmdline) *cmdline = ' ';
  159.     close(fd);
  160.  
  161.     statp = proc_stat;      /* hunt down string referring to
  162.                    process status */
  163.     while (statp->mint != mydta.dta_attribute &&
  164.        statp->mint >= 0) statp++;
  165.  
  166. /*        PID  PPID PRI CURPRI STATUS   SIZE     TIME   COMMAND */
  167.     if (hour) {
  168.     printf("%03d  %03d %3d   %3d  %s  %8ld %02ld:%02ld:%02ld  %s%s\n",
  169.         pid, ppid, pri, curpri, statp->desc,
  170.         mydta.dta_size,
  171.         hour,
  172.         min,
  173.         sec,
  174.         mydta.dta_name,
  175.         cmdline);
  176.     }
  177.     else {
  178.     printf("%03d  %03d %3d   %3d  %s  %8ld %02ld:%02ld.%02ld  %s%s\n",
  179.         pid, ppid, pri, curpri, statp->desc,
  180.         mydta.dta_size,
  181.         min,
  182.         sec,
  183.         frac,
  184.         mydta.dta_name,
  185.         cmdline);
  186.     }
  187. next:
  188.     fserror = Fsnext();
  189.   }
  190.   exit(0);
  191. }
  192.