Académique Documents
Professionnel Documents
Culture Documents
void main(void) { printf("Identificador de usuario: %d\n", getuid()); printf("Identificador de usuario efectivo: %d\n", geteuid()); printf("Identificador de grupo: %d\n", getgid()); printf("Identificador de grupo efetivo: %d\n", getegid()); }
void main(void) { char *home = NULL; home = getenv("HOME"); if (home == NULL) printf("$HOME no se encuentra definida\n"); else printf("El valor de $HOME es %s\n", home); }
CREACIN DE UN PROCESO
En una interfaz POSIX la forma de crear un proceso es invocando el servicio fork. El S.O trata este servicio realizando una clonacin del proceso que lo solicite, constituyendo la relacin con el nuevo proceso padre-hijo. Su prototipo es: pid_t fork();
La creacin del proceso se realiza copiando la imagen de memoria y el BCP, definiendo que el proceso hijo es una copia del proceso padre en el instante en que este solicita el servicio fork(). Significa que los datos y la pila del proceso hijo son los que tiene el proceso padre en ese instante de ejecucin. Es mas dado que al entrar el S.O a tratar el servicio, lo primero que hace es salvar los registros del BCP padre, al copiarse el BCP se copian los valores salvados de los registros , por lo que el hijo tiene los mismos valores que el padre.
GRUPO No 3 GRUPO No 2
GRUPO No 1 GRUPO No 4
CREACIN DE UN PROCESO
Todo esto significa que el contador de programa de los 2 procesos tienen el mismo valor, por lo que van a ejecutar la misma instruccin de mquina, No conceptualizar que el proceso hijo empieza la ejecucin del cdigo en su punto de inicio, repetimos que el hijo empieza a ejecutar al igual que el padre en la sentencia que est despus del fork() El proceso hijo no es totalmente idntico al padre, algunos valores de su BCP han de ser distintos y estos son: 1. El Ph tiene su propio identificador de proceso 2. El Ph tiene una nueva descripcin de memoria, aunque tenga los mismos segmentos con el mismo contenido, no tienen porque estar en la misma zona de memoria (especialmente en sistemas con memoria virtual) 3. El tiempo de ejecucin del proceso hijo es igual a 0 4. El valor que retorna el S.O como resultado del fork es distinto en el hijo y el padre (hijo recibo 0 y el padre recibe el identificador del proceso hijo) 5. Todas las alarmas pendientes se desactivan en el proceso hijo.
CREACIN DE UN PROCESO
Programa que crea un proceso.
#include <sys/types.h> #include <stdio.h> #include <unistd.h> #include <sys/wait.h> void main(void) { pid_t pid; pid = fork(); switch(pid) { case -1: /* error del fork() */ perror("fork"); break; case 0: /* proceso hijo */ printf("Proceso %d; padre = %d \n", getpid(), getppid()); break; default: /* padre */ printf("Proceso %d; padre = %d \n", getpid(), getppid()); } }
CREACIN DE UN PROCESO
1
2
Encada ejecucin del bucle se crea un proceso. El proceso padre obtiene el identificador del proceso hijo, que ser distinto de 0 y saldr del bucle utilizando break. El proceso hijo continuar la ejecucin, repitindose este proceso hasta que llegue al final del bucle.
CREACIN DE UN PROCESO
PROGRAMA 03-07 Programa que crea la estructura de procesos. #include <stdio.h> #include <sys/types.h> #include <unistd.h> void main(void) { pid_t pid; int i; int n = 10; for (i = 0; i < n; i++) { pid = fork(); if (pid == 0) break; } printf("El padre del proceso %d es %d\n", getpid(), getppid()); }
En este programa, es el proceso hijo el que finaliza la ejecucin del bucle ejecutando la sentencia break, siendo el padre encargado de crear todos los procesos
Recuerde que el servicio fork crea un nuevo proceso que ejecuta el mismo programa que el proceso padre y el servicio exec no crea un nuevo proceso sino que permite que un proceso pase a ejecutar un programa distinto
En la fase de vaciado se conservan algunas informaciones como: Entorno del proceso Que el S.O incluye en la nueva pila del proceso. Algunas informaciones del BCP como Identificador del proceso, del proceso padre, del usuario y descriptores de archivos abiertos En la fase de carga hay que realizar las siguientes operaciones: Asignar el proceso un nuevo espacio de memoria. Cargar el texto y datos iniciales en los segmentos correspondientes Crear la pila inicial del proceso con el entorno y los parmetros que se pasan Rellenar el BCP con los valores iniciales de los registros y la descripcin de los nuevos segmentos de memoria
// Ejemplo: Programa que ejecuta el comando ls l #include <sys/types.h> #include <sys/wait.h> #include <stdio.h> #include <unistd.h> int main() { pid_t pid; int status; pid = fork(); switch(pid) { case -1: /* error del fork() */ exit(-1); case 0: /* proceso hijo */ execlp("ls","ls","-l",NULL); perror("exec"); break; default: /* padre */ printf("Proceso padre\n"); while(pid != wait(&status)); } }
BIBLIOGRAFIA
- SILBERSCHATZ,A.(2003).FUNDAMENTOS DE SISTEMAS.MADRID.FANTASTICA - TENENBAUM,A.(1999). DISEO E IMPLEMTACION.SEGUNDA EDICION.PEARSON. - WILLIAN, S.(1998). SISTEMAS OPERATIVOS. SEGUNDA EDICION. PRENTICE HALL