ps.c 2.7 KB

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