Está en la página 1de 5

POSIX

Portable Operating System Interface Para UNIX

Nombre: Carrera: Nivel: Materia:


INTRODUCCION POSIX significa Portable Operating System Interface (for UNIX). Es un estndar orientado a facilitar la creacin de aplicaciones aplicaciones confiables y portables. La mayora de las versiones populares de UNIX (Linux, Mac OS X) cumplen este estndar en gran medida. La biblioteca para el manejo de hilos en POSIX es pthread. IDENTIFICACIN DE PROCESOS ENTORNO DE UN PROCESO CREACIN DE PROCESOS TERMINACIN DE PROCESOS DESARROLLO IDENTIFICACIN DE PROCESOS As como un proceso tiene un PID (Process Identification), cada hilo tiene un identificador de hilo. Mientras los PID son enteros no negativos, el ID de un hilo es dependiente del SO y puede ser una estructura. Por esto para su comparacin se usa una funcin.

#include <pthread.h> Compara dos identificados de hilos tid1 int pthread_equal(pthread_t y tid2 tid1, pthread_t tid2); Retorna: no cero si es igual, cero en otro caso #include <pthread.h> Para obtener identificador de un hilo pthread_t pthread_self(void); Retorna: la ID del hilo que la llam

ENTORNO DE UN PROCESO Viene definido por una lista de variables que se pasan al mismo en el momento de comenzar su ejecucin. Estas variables se denominan variables de entorno y son accesibles a un proceso a travs de la variable externa environ, declarada de la siguiente forma. extern char **environ; Esta variable apunta a una lista de variables de entorno. Esta lista no es ms que un vector de punteros a cadenas de caracteres de la forma nombre=valor, donde nombre hace referencia al nombre de una variable de entorno y valor al contenido de la misma. Ejemplo: Programa que imprime el entorno de un proceso #include <stdio.h> #include <stdlib.h> extern char **environ; int main(int argc, char **argv) SISTEMAS OPERATIVOS II 5 DE 48 CTEDRA SISTEMAS OPERATIVOS II 2006 { int i; printf("Lista de variables de entorno de %s\n",argv[0]); for (i=0 ; environ[i] != NULL ; i++) printf("environ[%d] = %s\n", i, environ[i]); }

CREACION DE PROCESOS La nica forma es invocando la llamada al sistema fork. El SO realiza un clonacin del proceso que lo solicite. El proceso que solicita el servicio se convierte en el proceso padre del nuevo proceso. pid_t fork() La clonacin se realiza copiando la imagen de memoria y la PCB. El proceso hijo es una copia del proceso padre en el instante en que ste solicita al servicio fork. Esto significa que los datos y la pila del proceso hijo son los que tiene el padre en ese instante de ejecucin. Es ms, dado que, al entrar el sistema operativo a tratar el servicio, lo primero que SISTEMAS OPERATIVOS II 6 DE 48 CTEDRA SISTEMAS OPERATIVOS II 2006 hace es salva los registro en la PCB del padre, al copiarse la PCB se copian los valores salvado de los registro, por lo que el hijo tiene los mismos valores que el padre. Esto significa que el contador de programa de los dos procesos tiene el mismo valor, por lo que van a ejecutar la misma instruccin mquina. No hay que caer en el error de pensar que el proceso hijo empieza la ejecucin del cdigo en su punto de inicio, sino que el proceso hijo comienza a ejecutar, al igual que el padre, la sentencia que se encuentra despus de fork(). Las diferencias que existen entre el proceso hijo y el padre son: El proceso hijo tiene su propio identificador(PID). El proceso hijo tiene una nueva descripcin de la memoria. Aunque el hijo tenga los segmentos con el mismo contenido, no tienen por qu est en la misma zona de memoria. El tiempo de ejecucin del proceso hijo es igual a cero. Toda la alarma pendiente se desactiva en el proceso hijo. El conjunto de seales pendientes se pone en cero. El valor que retorna el sistema operativo como resultado de fork() e distinto en el hijo que el padre (el hijo recibe un 0 y el padre el PID del hijo). Este valor de retorno se puede utilizar mediante una clusula de condicin para que le padre y el hijo sigan flujos de ejecucin distintos. Las modificaciones que realice el proceso padre sobre sus registros e imagen de memoria despus de fork no afectan al hijo y, viceversa. Sin embargo, el proceso hijo tiene su propia copia de los descriptores del proceso padre.

TERMINACION DE PROCESOS Si un hilo invoca a exit, _Exit o _exit, todo el proceso terminar. Un hilo puede terminar de tres maneras sin terminar el proceso: Retornando de su rutina de Inicio, cancelado por otro hilo del mismo proceso, o llamando pthread_exit.

#include <pthread.h> rval_ptr queda disponible para otros hilos al llamar void pthread_exit (void * rval_ptr); pthread_join rval_ptr debe existir despus del trmino del hilo. int pthread_join(pthread_t tid, void El hilo llamante se bloquea hasta el trmino del hilo ** rval_ptr); indicado. Si el hilo en cuestin es cancelado, rval_prt toma el valor PTHREAD_CANCELED Si no estamos interesados en el valor retornado, poner NULL. int pthread_cancel(pthread_t tid); Permite a un hilo cancelar otro hilo del mismo proceso. Retorno 0 es OK, !=0 => error. Equivale a si el hilo indicado llamara pthread_exit(PTHREAD_CANCELED); sin embargo, un hilo puede ignorar este requerimiento o controlar cmo se cancela. pthread_cancel slo hace un requerimiento, pero no lo fuerza.

int pthread_setcacelstate(int state, Permite cambiar el estado del hilo a int * oldstate); PTHREAD_CANCEL_ENABLE (default) o PTHREAD_CANCEL_DISABLE, en este estado el hilo ignora llamados a pthread_cancel que le afecten. Ejemplos: Recuperando el estatus de trmino de hilos: exitstatus.c No debemos usar variables automticas (aquellas en stack) como en pthread_exit, ver badexit2.c

BIBLIOGRAFIA Black, D. P. Managing Switched Local Area Networks, A Practical Guide. Addison-Wesley, 1998. Fiamingo, Frank G., DeBula, Linda y Condron, Linda: Introduction to UNIX. University Technology Services, The Ohio State University, 1998.