Está en la página 1de 7

Escuela Politcnica Nacional

Sistemas Operativos

ANLISIS DE LOS ARCHIVOS MIBASH.C Y


MIBASH2.C

Ricardo Taipe
14 de Junio 2015

Escuela Politcnica Nacional

Sistemas Operativos

INDICE

1. Introduccin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2. Objetivos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

3. Marco Terico. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

4. Desarrollo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

4.1 Cdigo MiBash.c. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

4.2 Cdigo MiBash2.c. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

4.3 Diferencias entre cdigos de programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

5. Grficas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

6. Conclusiones y Recomendaciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

7. Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

Escuela Politcnica Nacional

Sistemas Operativos

1. INTRODUCCIN.
Existen algunas llamadas al sistema en GNU Linux como son fork, exec, getpid,
getppid, wait/waitpid , exit.
En el trabajo que se presenta a continuacin, trata de una de las llamadas al
sistema exec la cual puede tener algunas variantes aadiendo letras como la e, l o
p.
A travs del informe a desarrollar, se tratar de analizar los dos archivos en
lenguaje de programacin ANSI C que permiten crear procesos en GNU Linux.

2. OBJETIVOS.
Analizar los archivos MiBash.c, MiBash2.c y entender las llamadas al sistema para
crear procesos con el uso de execv.

3. MARCO TERICO
Un proceso puede informalmente entenderse como un programa en ejecucin.
Formalmente un proceso es "Una unidad de actividad que se caracteriza por la
ejecucin de una secuencia de instrucciones, un estado actual, y un conjunto de
recursos del sistema asociados".[1]
Las funciones exec reemplazan el programa en ejecucin de un proceso con otro
programa. Cuando un programa llama a la funcin exec, el proceso deja de
ejecutar el programa actual y comienza a ejecutar el nuevo programa desde el
inicio. Hay varias funciones exec que varan ligeramente y que siguen ciertas
reglas.[2]

Escuela Politcnica Nacional

Sistemas Operativos

4. DESARROLLO.
4.1 CODIGO MIBASH.C
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
void ejecutar(char *comando);
int main(){
int estado;
char comando[50];
char opcion1[50];
do{
printf(">>");
scanf("%s", comando);
fflush(stdin);
int pid = fork();
if(pid == 0){
execlp(comando, comando,NULL);
}
wait(&estado);
}while(strcmp(comando, "exit") != 0);
}

4.2 CODIGO MIBASH2.C


#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
void ejecutar(char *comando);
void split(char *linea, char* args[]);
void procesarSalida(int pid, int estado);
int main(){
int estado;
char *args[10];
char comando[50];
char opcion1[50];
do{
printf(">>");
//Se obtiene el comando ingresado por teclado
(Usamos el fgets en lugar de gets por seguridad).
fgets(comando, sizeof(comando), stdin);
//Ponemos un caracter nulo al final de la cadena
(fgets pone un retorno de carro (ENTER) al final).
comando[strlen(comando) -1] = 0;
//LLamamos a la funcin que procesa la entrada y nos
retorna el comando y la lista de argumentos (A recordad punteros
:)
split(comando, args);
fflush(stdin);
//Creamos un nuevo proceso
int pid = fork();
//Ejecuta el proceso hijo
if(pid == 0){

Escuela Politcnica Nacional

Sistemas Operativos

printf("Comando: %s\n",comando);
//Cambiamos el programa actual por uno nuevo
(el del comando ingresado)
execvp(comando, args);
// Recuerden esto se ejecuta solo si el EXEC
FALL
fprintf(stderr, "Error al ejecutar EXEC\n");
exit(100);
}else if(pid < 0){
//Se ejcuta en caso de error al momento de
crear un nuevo proceso
fprintf(stderr, "Error al crear el proceso
FORK\n");
exit(1);
}//Esperamos a que el proceso hijo termine (Otra
forma de esperar, antes usamos el wait)
int pid_ter = waitpid(-1, &estado, 0);
#ifdef DEPURAR
procesarSalida(pid_ter, estado);
#endif
}while(strcmp(comando, "exit") != 0);
exit(0);
}
void split(char *linea, char* args[]){
#ifdef DEPURAR
printf("Ejecutando comando: %s \n", linea);
#endif
int i=0;
char *lineaAux = linea;
char *aux, *avance;
avance = lineaAux;
while(*avance != 0){
while(*avance != 32 && *avance != 0){
avance++;
}
aux = avance + 1;
*avance = 0;
args[i] = lineaAux;
#ifdef DEPURAR
printf("Parmetro encontrado: %s \n",
args[i]);
#endif
lineaAux = aux;
avance = aux;
while(*avance == 32){
avance++;
}
lineaAux = avance;
i++;
}
args[i] = (char *) NULL;
}
void procesarSalida(int pid, int estado){
int retorno;
if(WIFEXITED(estado)){

Escuela Politcnica Nacional

Sistemas Operativos

//Si entra implica que el proceso termin de ejcutarse


normalmente.
retorno = WEXITSTATUS(estado);
printf("El proceso %d termin con cdigo e error
%d\n", pid,retorno);
}else{
//Si entra implica que el proceso termin de ejecutarse por
una seal emitida
retorno = WTERMSIG(estado);
printf("El proceso %d termin por la seal %d\n",
pid,retorno);
}
}

4.3 DIFERENCIAS ENTRE CODIGOS


MiBash.c
El programa no acepta una ruta absoluta.

Utiliza el comando execlp con el cual es obligatorio colocar un NULL


al final. Acepta una lista de argumentos usando el mecanismo varargs de
C.

MiBash2.c

El programa acepta una ruta absoluta.


Posee directivas condicionales de pre procesamiento.
Utiliza el comando execvp que acepta los nombres del programa y
buscan el programa por su nombre en la ruta de ejecucin actual.

5. GRFICAS.

Figura1 MiBash.c

Escuela Politcnica Nacional

Sistemas Operativos

Figura2 MiBash2.c
6. CONCLUSIONES Y RECOMENDACIONES.
Las directivas de archivos nos permiten tener diferentes versiones de un
programa.
La directiva #if, con las directivas #elif, #else y #endif, controla la compilacin
de partes de un archivo de cdigo fuente.
Al momento de compilar el archivo para hacer efectivas las directivas
condicionales es necesario agregar DDEPURAR para que podamos observar las
partes del cdigo que se ubican dentro de las mismas.

7. REFERENCIAS.
[1] Stallings 5 edicin pag. 109
[2] Diapositivas materia de Sistemas Operativos Ing. Danny Guamn.

También podría gustarte