ps.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. void ps(char*);
  5. void error(char*);
  6. int cmp(void*, void*);
  7. Biobuf bout;
  8. int pflag;
  9. int aflag;
  10. void
  11. main(int argc, char *argv[])
  12. {
  13. int fd, i, tot, none = 1;
  14. Dir *dir, **mem;
  15. ARGBEGIN {
  16. case 'a':
  17. aflag++;
  18. break;
  19. case 'p':
  20. pflag++;
  21. break;
  22. } ARGEND;
  23. Binit(&bout, 1, OWRITE);
  24. if(chdir("/proc")==-1)
  25. error("/proc");
  26. fd=open(".", OREAD);
  27. if(fd<0)
  28. error("/proc");
  29. tot = dirreadall(fd, &dir);
  30. if(tot <= 0){
  31. fprint(2, "ps: empty directory /proc\n");
  32. exits("empty");
  33. }
  34. mem = malloc(tot*sizeof(Dir*));
  35. for(i=0; i<tot; i++)
  36. mem[i] = dir++;
  37. qsort(mem, tot, sizeof(Dir*), cmp);
  38. for(i=0; i<tot; i++){
  39. ps(mem[i]->name);
  40. none = 0;
  41. }
  42. if(none)
  43. error("no processes; bad #p");
  44. exits(0);
  45. }
  46. void
  47. ps(char *s)
  48. {
  49. int i, n, fd;
  50. char buf[64];
  51. int basepri, pri;
  52. long utime, stime, size;
  53. char pbuf[8];
  54. #define NAMELEN 28
  55. char status[2*NAMELEN+12+9*12+1];
  56. char args[256];
  57. char *p;
  58. sprint(buf, "%s/status", s);
  59. fd = open(buf, OREAD);
  60. if(fd<0)
  61. return;
  62. n = read(fd, status, sizeof status-1);
  63. close(fd);
  64. if(n <= 0)
  65. return;
  66. status[n] = '\0';
  67. p = strchr(status, ' ');
  68. if(!p)
  69. return;
  70. *p = 0;
  71. p = strchr(status+NAMELEN, ' ');
  72. if(!p)
  73. return;
  74. *p = 0;
  75. status[2*NAMELEN+12-1] = 0;
  76. utime = atol(status+2*NAMELEN+12)/1000;
  77. stime = atol(status+2*NAMELEN+12+1*12)/1000;
  78. size = atol(status+2*NAMELEN+12+6*12);
  79. if(pflag){
  80. basepri = atol(status+2*NAMELEN+12+7*12);
  81. pri = atol(status+2*NAMELEN+12+8*12);
  82. sprint(pbuf, " %2d %2d", basepri, pri);
  83. } else
  84. pbuf[0] = 0;
  85. Bprint(&bout, "%-10s %8s %4ld:%.2ld %3ld:%.2ld%s %7ldK %-.8s ",
  86. status+NAMELEN,
  87. s,
  88. utime/60, utime%60,
  89. stime/60, stime%60,
  90. pbuf,
  91. size,
  92. status+2*NAMELEN);
  93. if(aflag == 0){
  94. Noargs:
  95. Bprint(&bout, "%s\n", status);
  96. return;
  97. }
  98. sprint(buf, "%s/args", s);
  99. fd = open(buf, OREAD);
  100. if(fd < 0)
  101. goto Badargs;
  102. n = read(fd, args, sizeof args-1);
  103. close(fd);
  104. if(n < 0)
  105. goto Badargs;
  106. if(n == 0)
  107. goto Noargs;
  108. args[n] = '\0';
  109. for(i=0; i<n; i++)
  110. if(args[i] == '\n')
  111. args[i] = ' ';
  112. Bprint(&bout, "%s\n", args);
  113. return;
  114. Badargs:
  115. Bprint(&bout, "%s ?\n", status);
  116. }
  117. void
  118. error(char *s)
  119. {
  120. fprint(2, "ps: %s: ", s);
  121. perror("error");
  122. exits(s);
  123. }
  124. int
  125. cmp(void *va, void *vb)
  126. {
  127. Dir **a, **b;
  128. a = va;
  129. b = vb;
  130. return atoi((*a)->name) - atoi((*b)->name);
  131. }