nice.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /* vi: set sw=4 ts=4: */
  2. /*
  3. * nice implementation for busybox
  4. *
  5. * Copyright (C) 2005 Manuel Novoa III <mjn3@codepoet.org>
  6. *
  7. * Licensed under GPLv2 or later, see file LICENSE in this source tree.
  8. */
  9. //config:config NICE
  10. //config: bool "nice (1.8 kb)"
  11. //config: default y
  12. //config: help
  13. //config: nice runs a program with modified scheduling priority.
  14. //applet:IF_NICE(APPLET_NOEXEC(nice, nice, BB_DIR_BIN, BB_SUID_DROP, nice))
  15. //kbuild:lib-$(CONFIG_NICE) += nice.o
  16. //usage:#define nice_trivial_usage
  17. //usage: "[-n ADJUST] [PROG ARGS]"
  18. //usage:#define nice_full_usage "\n\n"
  19. //usage: "Change scheduling priority, run PROG\n"
  20. //usage: "\n -n ADJUST Adjust priority by ADJUST"
  21. #include <sys/resource.h>
  22. #include "libbb.h"
  23. int nice_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
  24. int nice_main(int argc, char **argv)
  25. {
  26. int old_priority, adjustment;
  27. old_priority = getpriority(PRIO_PROCESS, 0);
  28. if (!*++argv) { /* No args, so (GNU) output current nice value. */
  29. printf("%d\n", old_priority);
  30. fflush_stdout_and_exit(EXIT_SUCCESS);
  31. }
  32. adjustment = 10; /* Set default adjustment. */
  33. if (argv[0][0] == '-') {
  34. if (argv[0][1] == 'n') { /* -n */
  35. if (argv[0][2]) { /* -nNNNN (w/o space) */
  36. argv[0] += 2; argv--; argc++;
  37. }
  38. } else { /* -NNN (NNN may be negative) == -n NNN */
  39. argv[0] += 1; argv--; argc++;
  40. }
  41. if (argc < 4) { /* Missing priority and/or utility! */
  42. bb_show_usage();
  43. }
  44. adjustment = xatoi_range(argv[1], INT_MIN/2, INT_MAX/2);
  45. argv += 2;
  46. }
  47. { /* Set our priority. */
  48. int prio = old_priority + adjustment;
  49. if (setpriority(PRIO_PROCESS, 0, prio) < 0) {
  50. bb_perror_msg_and_die("setpriority(%d)", prio);
  51. }
  52. }
  53. BB_EXECVP_or_die(argv);
  54. }