Changeset 2725 in MondoRescue for branches/2.2.9/mindi-busybox/miscutils/chrt.c
- Timestamp:
- Feb 25, 2011, 9:26:54 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2.2.9/mindi-busybox/miscutils/chrt.c
r1765 r2725 2 2 /* 3 3 * chrt - manipulate real-time attributes of a process 4 * Copyright (c) 2006-2007 Bernhard Fischer4 * Copyright (c) 2006-2007 Bernhard Reutner-Fischer 5 5 * 6 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.6 * Licensed under GPLv2 or later, see file LICENSE in this source tree. 7 7 */ 8 9 8 #include <sched.h> 10 #include <getopt.h> /* optind */11 9 #include "libbb.h" 12 10 #ifndef _POSIX_PRIORITY_SCHEDULING 13 11 #warning your system may be foobared 14 12 #endif 13 15 14 static const struct { 16 constint policy;17 c onst char const name[12];15 int policy; 16 char name[sizeof("SCHED_OTHER")]; 18 17 } policies[] = { 19 18 {SCHED_OTHER, "SCHED_OTHER"}, … … 22 21 }; 23 22 23 //TODO: add 24 // -b, SCHED_BATCH 25 // -i, SCHED_IDLE 26 24 27 static void show_min_max(int pol) 25 28 { 26 const char *fmt = "%s min/max priority\t: % d/%d\n\0%s not supported?\n";29 const char *fmt = "%s min/max priority\t: %u/%u\n"; 27 30 int max, min; 31 28 32 max = sched_get_priority_max(pol); 29 33 min = sched_get_priority_min(pol); 30 if (max >= 0 && min >= 0) 31 printf(fmt, policies[pol].name, min, max); 32 else { 33 fmt += 29; 34 printf(fmt, policies[pol].name); 35 } 34 if ((max|min) < 0) 35 fmt = "%s not supported\n"; 36 printf(fmt, policies[pol].name, min, max); 36 37 } 37 38 … … 42 43 #define OPT_o (1<<4) 43 44 44 int chrt_main(int argc, char ** argv);45 int chrt_main(int argc , char**argv)45 int chrt_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 46 int chrt_main(int argc UNUSED_PARAM, char **argv) 46 47 { 47 48 pid_t pid = 0; 48 49 unsigned opt; 49 50 struct sched_param sp; 50 char *p_opt = NULL, *priority = NULL; 51 const char *state = "current\0new"; 52 int prio = 0, policy = SCHED_RR; 51 char *pid_str; 52 char *priority = priority; /* for compiler */ 53 const char *current_new; 54 int policy = SCHED_RR; 53 55 54 opt_complementary = "r--fo:f--ro:r--fo"; /* only one policy accepted */ 55 opt = getopt32(argv, "+mp:rfo", &p_opt); 56 /* at least 1 arg; only one policy accepted */ 57 opt_complementary = "-1:r--fo:f--ro:r--fo"; 58 opt = getopt32(argv, "+mprfo"); 56 59 if (opt & OPT_r) 57 60 policy = SCHED_RR; … … 60 63 if (opt & OPT_o) 61 64 policy = SCHED_OTHER; 62 63 65 if (opt & OPT_m) { /* print min/max */ 64 66 show_min_max(SCHED_FIFO); … … 67 69 fflush_stdout_and_exit(EXIT_SUCCESS); 68 70 } 71 72 argv += optind; 69 73 if (opt & OPT_p) { 70 if (argc == optind+1) { /* -p <priority> <pid> */ 71 priority = p_opt; 72 p_opt = argv[optind]; 74 pid_str = *argv++; 75 if (*argv) { /* "-p <priority> <pid> [...]" */ 76 priority = pid_str; 77 pid_str = *argv; 73 78 } 74 argv += optind; /* me -p <arg>*/75 pid = xatoul_range(p _opt, 1, ULONG_MAX); /* -p <pid> */79 /* else "-p <pid>", and *argv == NULL */ 80 pid = xatoul_range(pid_str, 1, ((unsigned)(pid_t)ULONG_MAX) >> 1); 76 81 } else { 77 argv += optind; /* me -p <arg> */ 78 priority = *argv; 79 } 80 if (priority) { 81 /* from the manpage of sched_getscheduler: 82 [...] sched_priority can have a value 83 in the range 0 to 99. 84 [...] SCHED_OTHER or SCHED_BATCH must be assigned 85 the static priority 0. [...] SCHED_FIFO or 86 SCHED_RR can have a static priority in the range 1 to 99. 87 */ 88 prio = xstrtol_range(priority, 0, policy == SCHED_OTHER 89 ? 0 : 1, 99); 82 priority = *argv++; 83 if (!*argv) 84 bb_show_usage(); 90 85 } 91 86 87 current_new = "current\0new"; 92 88 if (opt & OPT_p) { 93 int pol = 0;94 print_rt_info:89 int pol; 90 print_rt_info: 95 91 pol = sched_getscheduler(pid); 96 92 if (pol < 0) 97 bb_perror_msg_and_die(" failed to%cet pid %d's policy", 'g', pid);93 bb_perror_msg_and_die("can't %cet pid %d's policy", 'g', pid); 98 94 printf("pid %d's %s scheduling policy: %s\n", 99 pid, state, policies[pol].name);95 pid, current_new, policies[pol].name); 100 96 if (sched_getparam(pid, &sp)) 101 bb_perror_msg_and_die(" failed toget pid %d's attributes", pid);97 bb_perror_msg_and_die("can't get pid %d's attributes", pid); 102 98 printf("pid %d's %s scheduling priority: %d\n", 103 pid, state, sp.sched_priority); 104 if (!*argv) /* no new prio given or we did print already, done. */ 99 pid, current_new, sp.sched_priority); 100 if (!*argv) { 101 /* Either it was just "-p <pid>", 102 * or it was "-p <priority> <pid>" and we came here 103 * for the second time (see goto below) */ 105 104 return EXIT_SUCCESS; 105 } 106 *argv = NULL; 107 current_new += 8; 106 108 } 107 109 108 sp.sched_priority = prio; 110 /* from the manpage of sched_getscheduler: 111 [...] sched_priority can have a value in the range 0 to 99. 112 [...] SCHED_OTHER or SCHED_BATCH must be assigned static priority 0. 113 [...] SCHED_FIFO or SCHED_RR can have static priority in 1..99 range. 114 */ 115 sp.sched_priority = xstrtou_range(priority, 0, policy != SCHED_OTHER ? 1 : 0, 99); 116 109 117 if (sched_setscheduler(pid, policy, &sp) < 0) 110 bb_perror_msg_and_die("failed to %cet pid %d's policy", 's', pid); 111 if (opt & OPT_p) { 112 state += 8; 113 ++argv; 118 bb_perror_msg_and_die("can't %cet pid %d's policy", 's', pid); 119 120 if (!argv[0]) /* "-p <priority> <pid> [...]" */ 114 121 goto print_rt_info; 115 } 116 ++argv; 117 BB_EXECVP(*argv, argv); 118 bb_perror_msg_and_die("%s", *argv); 122 123 BB_EXECVP_or_die(argv); 119 124 } 120 #undef OPT_p121 #undef OPT_r122 #undef OPT_f123 #undef OPT_o124 #undef OPT_m
Note:
See TracChangeset
for help on using the changeset viewer.