Ejercicios de Sistemas Operativos Ingeniería Informática

Anuncio
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.
Descargar