#include <sys/param.h> #include <sys/proc.h> #include <stdio.h> struct proc proc[NPROC]; struct { char name[8]; int type; unsigned value; } nl[] = { "_proc", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* * Change the running priority (nice) of a process which is already * running. * * Author: Kurt Shoens */ main(argc, argv) char **argv; { register struct proc *pp; int pid, nice; int addr, mem, a1, a2, coreaddr; if (argc != 2 && argc != 3) { fprintf(stderr, "usage: renice pid [ priority ]\n"); exit(1); } if (geteuid()) { fprintf(stderr, "NOT super user\n"); exit(1); } pid = atoi(argv[1]); nice = atoi(argc == 3 ? argv[2] : "19"); if (nice > 20) nice = 20; if (nice < -20) nice = -20; nice += NZERO; mem = open("/dev/kmem", 2); if (mem < 0) { perror("/dev/kmem"); exit(1); } nlist("/vmunix", nl); addr = nl[0].value; if (addr == 0) { fprintf(stderr, "/vmunix: _proc not in namelist"); exit(1); } lseek(mem, addr, 0); read(mem, &proc[0], sizeof proc); for (pp = &proc[0]; pp < &proc[NPROC]; pp++) if (pp->p_pid == pid) break; if (pp >= &proc[NPROC]) { fprintf(stderr, "%d: process not found\n", pid); exit(1); } fprintf(stderr, "%d: old nice = %d, new nice = %d\n", pid, pp->p_nice - NZERO, nice - NZERO); a1 = (int)&pp->p_nice; a2 = (int)&proc[0]; coreaddr = a1-a2+addr; lseek(mem, (long)coreaddr, 0); write(mem, &nice, 1); }