/* * Copyright (c) 2008, The Android Open Source Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of Google, Inc. nor the names of its contributors * may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/time.h> #include <sys/resource.h> #include <sched.h> #include <getopt.h> static void usage(const char *s) { fprintf(stderr, "USAGE: %s [[-r] [-t TYPE] priority pids ...] [-g pid]\n", s); exit(EXIT_FAILURE); } void print_prio(pid_t pid) { int sched; struct sched_param sp; printf("pid %d's priority: %d\n", pid, getpriority(PRIO_PROCESS, pid)); printf("scheduling class: "); sched = sched_getscheduler(pid); switch (sched) { case SCHED_FIFO: printf("FIFO\n"); break; case SCHED_RR: printf("RR\n"); break; case SCHED_OTHER: printf("Normal\n"); break; case -1: perror("sched_getscheduler"); break; default: printf("Unknown\n"); } sched_getparam(pid, &sp); printf("RT prio: %d (of %d to %d)\n", sp.sched_priority, sched_get_priority_min(sched), sched_get_priority_max(sched)); } int get_sched(char *str) { if (strcasecmp(str, "RR") == 0) return SCHED_RR; else if (strcasecmp(str, "FIFO") == 0) return SCHED_FIFO; else if (strcasecmp(str, "NORMAL") == 0) return SCHED_OTHER; else if (strcasecmp(str, "OTHER") == 0) return SCHED_OTHER; return SCHED_RR; } int renice_main(int argc, char *argv[]) { int prio; int realtime = 0; int opt; int sched = SCHED_RR; char *cmd = argv[0]; do { opt = getopt(argc, argv, "rt:g:"); if (opt == -1) break; switch (opt) { case 'r': // do realtime priority adjustment realtime = 1; break; case 't': sched = get_sched(optarg); break; case 'g': print_prio(atoi(optarg)); return 0; default: usage(cmd); } } while (1); argc -= optind; argv += optind; if (argc < 1) usage(cmd); prio = atoi(argv[0]); argc--; argv++; if (argc < 1) usage(cmd); while(argc) { pid_t pid; pid = atoi(argv[0]); argc--; argv++; if (realtime) { struct sched_param sp = { .sched_priority = prio }; int ret; ret = sched_setscheduler(pid, sched, &sp); if (ret) { perror("sched_set_scheduler"); exit(EXIT_FAILURE); } } else { int ret; ret = setpriority(PRIO_PROCESS, pid, prio); if (ret) { perror("setpriority"); exit(EXIT_FAILURE); } } } return 0; }