Ejercicios de Sistemas Operativos Ingeniería Informática Problema 1: Implementar kill Implementa en C para Plan 9 un programa kill que acabe con la ejecución de un proceso. El programa recibirá como parámetro el identificador de proceso que se desea terminar. El programa kill también aceptará una opción -n que permitirá terminar la ejecución de cualquier programa cuyo nombre sea el indicado en el argumento de dicha opción.. -2- Solución _____ kill.c #include <u.h> #include <libc.h> static void usage(void) { fprint(2, "usage: %s -n name\n\t%s pid...\n", argv0, argv0); exits("usage"); } static void kill(int pid) { char int fname[50]; fd; sprint(fname, "/proc/%d/ctl", pid); fd = open(fname, OWRITE); if(fd < 0){ fprint(2, "%s: %s: %r\n", argv0, fname); return; } if(write(fd, "kill", 4) != 4) fprint(2, "%s: %s: %r\n", argv0, fname); close(fd); } static void killprocs(char *name) { char fname[50]; char buf[512]; Dir *d; int nd, nr; int fd; int i; char *p; -3- fd = open("/proc", OREAD); if(fd < 0) sysfatal("/proc: %r"); nd = dirreadall(fd, &d); close(fd); if(nd <= 0) sysfatal("/proc: no entries"); for(i = 0; i < nd; i++) if(d[i].qid.type&QTDIR){ sprint(fname, "/proc/%s/status", d[i].name); fd = open(fname, OREAD); if(fd < 0) continue; /* perhaps it just exited */ nr = read(fd, buf, sizeof(buf)-1); if(nr > 0){ /* name user state ... */ p = strchr(buf, ’ ’); if(p != nil) *p = 0; if(strcmp(buf, name) == 0) kill(atoi(d[i].name)); } close(fd); } free(d); } void main(int argc, char *argv[]) { char *name; name = nil; ARGBEGIN{ case ’n’: name = EARGF(usage()); break; default: usage(); }ARGEND; if(argc == 0) if(name == nil) usage(); else killprocs(name); else while(argc-- > 0) kill(atoi(*argv++)); exits(nil); } Basta escribir kill en el fichero de control de los procesos indicados para matarlos. Si se ha indicado un pid, consideramos un error no poderlo matar. No obstante, no consideramos un error tener problemas mientras buscamos los procesos con un nombre dado.