int main(int argc, char **argv) { int i, policy = SCHED_RR, priority = 0, verbose = 0, policy_flag = 0, all_tasks = 0; struct sched_param sp; pid_t pid = -1; static const struct option longopts[] = { { "all-tasks", 0, NULL, 'a' }, { "batch", 0, NULL, 'b' }, { "fifo", 0, NULL, 'f' }, { "idle", 0, NULL, 'i' }, { "pid", 0, NULL, 'p' }, { "help", 0, NULL, 'h' }, { "max", 0, NULL, 'm' }, { "other", 0, NULL, 'o' }, { "rr", 0, NULL, 'r' }, { "reset-on-fork", 0, NULL, 'R' }, { "verbose", 0, NULL, 'v' }, { "version", 0, NULL, 'V' }, { NULL, 0, NULL, 0 } }; setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); while((i = getopt_long(argc, argv, "+abfiphmoRrvV", longopts, NULL)) != -1) { int ret = EXIT_FAILURE; switch (i) { case 'a': all_tasks = 1; break; case 'b': #ifdef SCHED_BATCH policy = SCHED_BATCH; #endif break; case 'f': policy = SCHED_FIFO; break; case 'R': #ifdef SCHED_RESET_ON_FORK policy_flag |= SCHED_RESET_ON_FORK; #endif break; case 'i': #ifdef SCHED_IDLE policy = SCHED_IDLE; #endif break; case 'm': show_min_max(); return EXIT_SUCCESS; case 'o': policy = SCHED_OTHER; break; case 'p': errno = 0; pid = strtol_or_err(argv[argc - 1], _("failed to parse pid")); break; case 'r': policy = SCHED_RR; break; case 'v': verbose = 1; break; case 'V': printf("%s from %s\n", program_invocation_short_name, PACKAGE_STRING); return EXIT_SUCCESS; case 'h': ret = EXIT_SUCCESS; /* fallthrough */ default: show_usage(ret); } } if (((pid > -1) && argc - optind < 1) || ((pid == -1) && argc - optind < 2)) show_usage(EXIT_FAILURE); if ((pid > -1) && (verbose || argc - optind == 1)) { if (all_tasks) { pid_t tid; struct proc_tasks *ts = proc_open_tasks(pid); if (!ts) err(EXIT_FAILURE, _("cannot obtain the list of tasks")); while (!proc_next_tid(ts, &tid)) show_rt_info(tid, FALSE); proc_close_tasks(ts); } else show_rt_info(pid, FALSE); if (argc - optind == 1) return EXIT_SUCCESS; } errno = 0; priority = strtol_or_err(argv[optind], _("failed to parse priority")); #ifdef SCHED_RESET_ON_FORK /* sanity check */ if ((policy_flag & SCHED_RESET_ON_FORK) && !(policy == SCHED_FIFO || policy == SCHED_RR)) errx(EXIT_FAILURE, _("SCHED_RESET_ON_FORK flag is suppoted for " "SCHED_FIFO and SCHED_RR policies only")); #endif policy |= policy_flag; if (pid == -1) pid = 0; sp.sched_priority = priority; if (all_tasks) { pid_t tid; struct proc_tasks *ts = proc_open_tasks(pid); if (!ts) err(EXIT_FAILURE, _("cannot obtain the list of tasks")); while (!proc_next_tid(ts, &tid)) if (sched_setscheduler(tid, policy, &sp) == -1) err(EXIT_FAILURE, _("failed to set tid %d's policy"), tid); proc_close_tasks(ts); } else if (sched_setscheduler(pid, policy, &sp) == -1) err(EXIT_FAILURE, _("failed to set pid %d's policy"), pid); if (verbose) show_rt_info(pid, TRUE); if (!pid) { argv += optind + 1; execvp(argv[0], argv); perror("execvp"); err(EXIT_FAILURE, _("failed to execute %s"), argv[0]); } return EXIT_SUCCESS; }
int main(int argc, char *argv[]) { int i, policy = SCHED_RR, priority = 0, verbose = 0; struct sched_param sp; pid_t pid = 0; struct option longopts[] = { { "fifo", 0, NULL, 'f' }, { "pid", 0, NULL, 'p' }, { "help", 0, NULL, 'h' }, { "max", 0, NULL, 'm' }, { "other", 0, NULL, 'o' }, { "rr", 0, NULL, 'r' }, { "verbose", 0, NULL, 'v' }, { "version", 0, NULL, 'V' }, { NULL, 0, NULL, 0 } }; while((i = getopt_long(argc, argv, "+fphmorvV", longopts, NULL)) != -1) { int ret = 1; switch (i) { case 'f': policy = SCHED_FIFO; break; case 'm': show_min_max(); return 0; case 'o': policy = SCHED_OTHER; break; case 'p': errno = 0; pid = strtol(argv[argc - 1], NULL, 10); if (errno) { perror("strtol"); fprintf(stderr, "failed to parse pid!\n"); return 1; } break; case 'r': policy = SCHED_RR; break; case 'v': verbose = 1; break; case 'V': printf("chrt (%s)\n", PACKAGE_STRING); return 0; case 'h': ret = 0; default: show_usage(argv[0]); return ret; } } if ((pid && argc - optind < 1) || (!pid && argc - optind < 2)) { show_usage(argv[0]); return 1; } if (pid && (verbose || argc - optind == 1)) { show_rt_info("current", pid); if (argc - optind == 1) return 0; } errno = 0; priority = strtol(argv[optind], NULL, 10); if (errno) { perror("strtol"); fprintf(stderr, "failed to parse priority!\n"); return 1; } sp.sched_priority = priority; if (sched_setscheduler(pid, policy, &sp) == -1) { perror("sched_setscheduler"); fprintf(stderr, "failed to set pid %d's policy\n", pid); return 1; } if (verbose) show_rt_info("new", pid); if (!pid) { argv += optind + 1; execvp(argv[0], argv); perror("execvp"); fprintf(stderr, "failed to execute %s\n", argv[0]); return 1; } return 0; }