/*el siguiente codigo se da como ayuda por si se quiere utilizar*/ /*NO ES OBLIGATORIO USARLO*/ /*y pueden usarse funciones enteras o parte de funciones */ /*Este fichero, ayudaP3.c no está pensado para ser compilado separadamente */ /*, entre otras cosas, no contiene los includes necesarios*/ /*y las constantes utilizadas, no están definidas en él*/ void Cmd_fork (char *tr[]) { pid_t pid; if ((pid=fork())==0){ /* VaciarListaProcesos(&LP); Depende de la implementación de cada uno*/ printf ("ejecutando proceso %d\n", getpid()); } else if (pid!=-1) waitpid (pid,NULL,0); } int BuscarVariable (char * var, char *e[]) /*busca una variable en el entorno que se le pasa como parámetro*/ { /*devuelve la posicion de la variable en el entorno, -1 si no existe*/ int pos=0; char aux[MAXVAR]; strcpy (aux,var); strcat (aux,"="); while (e[pos]!=NULL) if (!strncmp(e[pos],aux,strlen(aux))) return (pos); else pos++; errno=ENOENT; /*no hay tal variable*/ return(-1); } int CambiarVariable(char * var, char * valor, char *e[]) /*cambia una variable en el entorno que se le pasa como parámetro*/ { /*lo hace directamente, no usa putenv*/ int pos; char *aux; if ((pos=BuscarVariable(var,e))==-1) return(-1); if ((aux=(char *)malloc(strlen(var)+strlen(valor)+2))==NULL) return -1; strcpy(aux,var); strcat(aux,"="); strcat(aux,valor); e[pos]=aux; return (pos); } /*las siguientes funciones nos permiten obtener el nombre de una senal a partir del número y viceversa */ static struct SEN sigstrnum[]={ {"HUP", SIGHUP}, {"INT", SIGINT}, {"QUIT", SIGQUIT}, {"ILL", SIGILL}, {"TRAP", SIGTRAP}, {"ABRT", SIGABRT}, {"IOT", SIGIOT}, {"BUS", SIGBUS}, {"FPE", SIGFPE}, {"KILL", SIGKILL}, {"USR1", SIGUSR1}, {"SEGV", SIGSEGV}, {"USR2", SIGUSR2}, {"PIPE", SIGPIPE}, {"ALRM", SIGALRM}, {"TERM", SIGTERM}, {"CHLD", SIGCHLD}, {"CONT", SIGCONT}, {"STOP", SIGSTOP}, {"TSTP", SIGTSTP}, {"TTIN", SIGTTIN}, {"TTOU", SIGTTOU}, {"URG", SIGURG}, {"XCPU", SIGXCPU}, {"XFSZ", SIGXFSZ}, {"VTALRM", SIGVTALRM}, {"PROF", SIGPROF}, {"WINCH", SIGWINCH}, {"IO", SIGIO}, {"SYS", SIGSYS}, /*senales que no hay en todas partes*/ #ifdef SIGPOLL {"POLL", SIGPOLL}, #endif #ifdef SIGPWR {"PWR", SIGPWR}, #endif #ifdef SIGEMT {"EMT", SIGEMT}, #endif #ifdef SIGINFO {"INFO", SIGINFO}, #endif #ifdef SIGSTKFLT {"STKFLT", SIGSTKFLT}, #endif #ifdef SIGCLD {"CLD", SIGCLD}, #endif #ifdef SIGLOST {"LOST", SIGLOST}, #endif #ifdef SIGCANCEL {"CANCEL", SIGCANCEL}, #endif #ifdef SIGTHAW {"THAW", SIGTHAW}, #endif #ifdef SIGFREEZE {"FREEZE", SIGFREEZE}, #endif #ifdef SIGLWP {"LWP", SIGLWP}, #endif #ifdef SIGWAITING {"WAITING", SIGWAITING}, #endif {NULL,-1}, }; /*fin array sigstrnum */ int ValorSenal(char * sen) /*devuelve el numero de senial a partir del nombre*/ { int i; for (i=0; sigstrnum[i].nombre!=NULL; i++) if (!strcmp(sen, sigstrnum[i].nombre)) return sigstrnum[i].senal; return -1; } char *NombreSenal(int sen) /*devuelve el nombre senal a partir de la senal*/ { /* para sitios donde no hay sig2str*/ int i; for (i=0; sigstrnum[i].nombre!=NULL; i++) if (sen==sigstrnum[i].senal) return sigstrnum[i].nombre; return ("SIGUNKNOWN"); }