1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
| #include <sys/capability.h>
#include <stdio.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <stdlib.h> #include <stdarg.h> #include <sched.h>
void error(const char *file, int line,const char *str, ...) { va_list fmt; va_start(fmt, str); fprintf(stderr, "error:%s %s:%d\n", strerror(errno), file, line); vfprintf(stderr, str, fmt); fprintf(stderr, "\n"); va_end(fmt); }
#define ERROR(...) error(__FILE__, __LINE__, __VA_ARGS__); exit(1) #define FAIL(...) error(__FILE__, __LINE__, __VA_ARGS__); return -1
int raiseCap(int cap) { cap_value_t caplist[1]; cap_t capability = cap_get_proc(); if(capability == NULL) { FAIL(""); } caplist[0] = cap; if(cap_set_flag(capability, CAP_EFFECTIVE, 1, caplist, CAP_SET) == -1) { cap_free(capability); FAIL(""); } if(cap_set_proc(capability) == -1) { cap_free(capability); FAIL(""); } if(cap_free(capability) == -1) { FAIL(""); } return 0; }
int main(int argc, char *argv[]) { if(raiseCap(CAP_SYS_NICE) == -1) { ERROR("");} int j, policy; struct sched_param sp;
if(argc < 3 || strrchr("rfo", argv[1][0]) == NULL) { ERROR("usage: %s policy priority pid...\n" "\tpolicy is r(RR), f(FIFO), " #ifdef SCHED_BATCH "b(BATCH), " #endif #ifdef SCHED_IDLE "i(IDLE), " #endif "or o(OTHER)" , argv[0]); } switch (argv[1][0]) { case 'r': policy = SCHED_RR; break; case 'f': policy = SCHED_FIFO; break; #ifdef SCHED_BATCH case 'b': policy = SCHED_BATCH; break; #endif #ifdef SCHED_IDLE case 'i': policy = SCHED_IDLE; break; #endif case 'o': policy = SCHED_OTHER; break; default: ERROR("unsupported policy:%s\n", argv[1]); break; } sp.sched_priority = atoi(argv[2]); for(int j = 3; j < argc; j++) { pid_t pid = atoi(argv[j]); if(sched_setscheduler(pid, policy, &sp) == -1) { ERROR(""); } } }
|