|
|
1.1 ! root 1: #include <sys/param.h> ! 2: #include <sys/proc.h> ! 3: #include <stdio.h> ! 4: ! 5: struct proc proc[NPROC]; ! 6: struct { ! 7: char name[8]; ! 8: int type; ! 9: unsigned value; ! 10: } nl[] = { ! 11: "_proc", 0, 0, ! 12: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ! 13: }; ! 14: ! 15: /* ! 16: * Change the running priority (nice) of a process which is already ! 17: * running. ! 18: * ! 19: * Author: Kurt Shoens ! 20: */ ! 21: ! 22: main(argc, argv) ! 23: char **argv; ! 24: { ! 25: register struct proc *pp; ! 26: int pid, nice; ! 27: int addr, mem, a1, a2, coreaddr; ! 28: ! 29: if (argc != 2 && argc != 3) { ! 30: fprintf(stderr, "usage: renice pid [ priority ]\n"); ! 31: exit(1); ! 32: } ! 33: if (geteuid()) { ! 34: fprintf(stderr, "NOT super user\n"); ! 35: exit(1); ! 36: } ! 37: pid = atoi(argv[1]); ! 38: nice = atoi(argc == 3 ? argv[2] : "19"); ! 39: if (nice > 20) ! 40: nice = 20; ! 41: if (nice < -20) ! 42: nice = -20; ! 43: nice += NZERO; ! 44: mem = open("/dev/kmem", 2); ! 45: if (mem < 0) { ! 46: perror("/dev/kmem"); ! 47: exit(1); ! 48: } ! 49: nlist("/vmunix", nl); ! 50: addr = nl[0].value; ! 51: if (addr == 0) { ! 52: fprintf(stderr, "/vmunix: _proc not in namelist"); ! 53: exit(1); ! 54: } ! 55: lseek(mem, addr, 0); ! 56: read(mem, &proc[0], sizeof proc); ! 57: for (pp = &proc[0]; pp < &proc[NPROC]; pp++) ! 58: if (pp->p_pid == pid) ! 59: break; ! 60: if (pp >= &proc[NPROC]) { ! 61: fprintf(stderr, "%d: process not found\n", pid); ! 62: exit(1); ! 63: } ! 64: fprintf(stderr, "%d: old nice = %d, new nice = %d\n", ! 65: pid, ! 66: pp->p_nice - NZERO, ! 67: nice - NZERO); ! 68: a1 = (int)&pp->p_nice; ! 69: a2 = (int)&proc[0]; ! 70: coreaddr = a1-a2+addr; ! 71: lseek(mem, (long)coreaddr, 0); ! 72: write(mem, &nice, 1); ! 73: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.