Вы находитесь на странице: 1из 41

DOCTORADO EN INFORMTICA

PROGRAMACIN DE SISTEMAS UNIX: COMUNICACIN ENTRE PROCESOS NDICE.


1. PROCESOS.
1. 2. Conceptos generales. Ejecucin de comandos. 1. 2. 3. Subrutina system. Subrutinas exec.

Creacin de procesos. 1. 2. Subrutina fork. Subrutinas wait y waitpid.

4.

Terminacin de un proceso. 1. 2. Subrutina exit. Subrutina atexit.

2. SEALES.
1. 2. 3. Conceptos generales. Lista de las seales ms importantes. Capturar seales. 1. 2. 3. 4. Subrutina signal: Subrutina sigaction: Subrutina kill:

Alarmas y temporizadores. 1. Subrutinas alarm y ualarm:

5.

Tratamiento de errores. 1. 2. Lista de errores ms importantes. Subrutina perror:

3. PIPES (TUBERAS).

1. 2.

Conceptos generales. Redireccin. 1. 2. Subrutinas dup y dup2: Subrutina fcntl:

3.

Comunicacin entre procesos emparentados. 1. Subrutina pipe

4.

Comunicacin entre procesos no emparentados. 1. Subrutina mkfifo:

Lista de programas.
system.c - Listar los procesos del usuario usando system. exec.c - Listar los procesos del usuario usando exec. fork.c - Ejecucin conjunta de procesos padre e hijo. fork_huerf.c - Ejemplo de proceso hurfano. waitpid.c - Esperar la terminacin de un proceso hijo. atexic.c - Ejecucin de una rutina al salir de un programa. signal.c - Contar el nmero de CTRL-C en 15 segundos. kill.c - Ejecucin con tiempo de espera usando kill. alarm.c - Esperar una alarma. dup2.c - Redireccin usando dup2. pipe.c - Tubera sin nombre entre procesos padre e hijo. pipe_conec.c - Tubera entre 2 comandos usando pipe. lector_fifo.c - Tuberia con nombre usando mkfifo. escritor_fifo.c - Tuberia con nombre usando mkfifo. fifo - Carga los procesos lector y escritor en 2o plano.

1. PROCESOS.
1,1. Conceptos generales.
Proceso: programa o comando en ejecucin. Caractersticas:

Un proceso consta de cdigo, datos y pila. Los procesos existen en una jerarqua de rbol (varios Hijos, un slo padre). El sistema asigna un identificador de proceso (PID) nico al iniciar el proceso. El planificador de tareas asigna un tiempo compartido para el proceso segn su prioridad (slo root puede cambiar prioridades).

Ejecucin en 1er plano: proceso iniciado por el usuario o interactivo. Ejecucin en 2o plano: proceso no interactivo que no necesita ser iniciado por el usuario. Demonio: proceso en 2o plano siempre disponible, que da servicio a varias tareas (debe ser propiedad del usuario root). Proceso zombi: proceso parado que queda en la tabla de procesos hasta que termine su padre. Este hecho se produce cuando el proceso padre no recoge el cdigo de salida del proceso hijo. Proceso hurfano: proceso en ejecucin cuyo padre ha finalizado. El nuevo identificador de proceso padre (PPID) coincide con el identificador del proceso init (1).

1,2. Ejecucin de comandos.


1,2,1. Subrutina system:
- Descripcin: Llamada a un intrprete para ejecutar un comando. El proceso espera a que finalice la ejecucin de la subrutina y devuelve la salida del programa ejecutado. - Formato: #include <stdlib.h> int system (cadena) const char *cadena; - Parmetro: cadena - Comando a ejecutar. - Devuelve: Estado de salida del programa ejecutado. -1 o 127 en caso de error. - Comentarios: a) Se crea un proceso hijo (fork) y se lanza (exec) /usr/bin/bsh, que interpreta el comando a ejecutar. b) Si la llamada se hace con camino seguro, la orden exec ejecuta el intrprete /usr/bin/tsh. c) Se ignoran las seales SIGINT y SIGQUIT y se bloquea la seal SIGCHLD. d) La salida de system no afecta a la salida de los procesos hijos del proceso ejecutor.

- Ejemplo:
/* system.c - Listar los procesos del usuario usando system. */ #include <stdio.h> #include <stdlib.h> int main () { int salida; /* Salida del comando */ char comando[100]; /* Comando a ejecutar */ printf ("Ejemplo de system.\n");

sprintf (comando, "/bin/ps -fu %s", getenv ("USER")); salida = system (comando); printf ("Salida del comando: %d\n", salida); exit (salida); } Ejemplo de USER ramon ramon ramon ramon Salida del system. PID PPID 3638 1 10089 10600 10600 11623 11623 3638 comando: 0

TTY hft/0 hfp/0 hft/0 hft/0

CMD -ksh /bin/ps -fu ramon bsh bsh bsh system.e

Suponiendo que no existe el comando MUSHO y sustituyendo la ejecucin de system por la siguiente lnea, se obtiene la salida mostrada a continuacin. salida = system ("MUSHO BETI"); Ejemplo de system. bsh: MUSHO: no encontrado. Salida del comando: 256

1,2,2. Subrutinas exec>:


- Descripcin: Ejecuta un nuevo programa en el mismo proceso. Se crea un proceso imagen sustituyendo el programa actual por el nuevo. - Formatos: #include <unistd.h> int execl (camino, arg0 [, arg1, ...] , 0) const char *camino, *arg0, *arg1, ...; int execle (camino, arg0 [, arg1, ...] , 0, p_entorno) const char *camino, *arg0, *arg1, ...; char *const p_entorno[]; int execlp (fichero, arg0 [, arg1, ...] , 0) const char *fichero, *arg0, *arg1, ...; int execv (camino, val_args) const char *camino; char *const val_args[]; int execve (camino, val_arg, p_entorno) const char *camino; char *const val_args[], *p_entorno[]; int execvp (fichero, val_args) const char *fichero; char *const val_args[]; int exect (camino, val_arg, p_entorno) char *camino, *val_args, *p_entorno[]; - Sufijos: L - usa lista de parmetros, el ltimo debe ser 0. V - usa matriz de parmetros generada previamente, el ltimo debe ser 0. T - trazado del programa con ptrace (en desuso). E - usa la matriz de variables de entorno. P - bsqueda utilizando la variable PATH. - Parmetros:

camino - Camino completo del fichero ejecutable. fichero - Nombre del fichero ejecutable. argN - Argumento N-simo. val_args - Puntero a la matriz de argumentos. p_entorno - Puntero a la matriz del entorno. - Devuelve: -1, en caso de error. - Comentarios: a) La rutina principal (main) de un programa C ejecutable recibe los siguientes parmetros: int main (cont_args, val_args, p_entorno) int cont_args; /* Contador de argumentos. */ char *val_args; /* Puntero a la matriz de argumentos. */ char *p_entorno; /* Puntero a la matriz del entorno. */ Las variables val_args y p_entorno son similares a las utilizadas en las subrutinas exec. b) Esta rutina principal llama a una subrutina de iniciacin que construye la variable de entrono. Dicha variable global es accesible desde el programa declarndola de la siguiente manera: extern char **environ; Las subrutinas exec que no usan el parmetro p_entorno utilizan la variable environ. c) Los descriptores de ficheros abiertos se pasan al nuevo proceso imagen, excepto los que tengan activo el bit FD_CLOEXEC (ver fcntl). d) Las seales capturadas se reasignan a sus acciones por defecto; las ignoradas, continan siendo ignoradas (ver sigaction). e) Si el nuevo proceso imagen tiene activo el bit SUID, la identificacin efectiva de usuario (EUID) del nuevo proceso toma el valor del identificador del propietario. Idem, si tiene activo el bit SGID. f) Los identificadores reales de usuario y de grupo (RUID y RGID) mantienen el valor que tenan en el proceso llamador. g) El prrafo anterior puede aplicarse a ficheros remotos (previa traduccin de los identificadores). h) El prrafo e) no afecta a las shell-scripts. i) El proceso nuevo mantiene las siguientes caractersticas del proceso llamador: Identificadores de proceso (PID), de proceso padre (PPID) y de grupo de procesos (PGID). Valores de prioridad (nice), de TTY y del bit de trazado. Directorio actual y directorio raz. Mscara de ficheros, limites de longitud de ficheros, lmites de recursos. Tiempos para activar alarmas y subrutinas times. Identificador de usuario de conexin.

- Ejemplo:
/* exec.c - Listar los procesos del usuario usando exec. */ #include <stdio.h> #include <unistd.h> int main () { int salida;/* Salida del comando */ printf ("Ejemplo de exec.\n"); execl ("/bin/ps", "ps", "-fu", getenv ("USER"), 0); printf ("Salida del comando: %d\n", salida); exit (salida);

} Ejemplo de system. USER PID ramon 3638 ramon 10739

PPID 1 3638

TTY hft/0 hft/0

CMD -ksh /bin/ps -fu ramon

Suponiendo que no existe el comando MUSHO y sustituyendo la ejecucin de execl por la siguiente lnea, se obtiene la salida mostrada a continuacin. salida = execl ("MUSHO", "BETI", 0); Ejemplo de exec. Salida del comando: -1

1,3. Creacin de procesos.


1,3,1. Subrutina fork:
- Descripcin: Crea un nuevo proceso (hijo), copia casi exacta del proceso generador (padre). - Formato: #include <unistd.h> pid_t fork (); - Devuelve: 0 al proceso hijo y PID del hijo al proceso padre (-1, si error). - Comentarios: a) La versin BSD (en la librera libbsd.a) es: int vfork (); b) Atributos que hereda el proceso hijo. Entorno. Bit FD_CLOEXEC para cada descriptor de fichero. Seales capturadas. SUID y SGID. Estado de privilegios y prioridades. Libreras compartidas y segmentos de memoria compartida. PGID y TTYGID. Directorio actual y directorio raz. Mscara y lmites de medida para ficheros. Eventos y estado de auditora. Estado de depuracin. PID nico.

c) Atributos diferenciadores entre padre e hijo:

PPID distintos (el PPID del hijo coincide con el PID del padre). El proceso hijo tiene su propia copia de los descriptores de fichero del padre, pero comparte con ste un puntero a fichero para cada descriptor del proceso padre. Bloqueos de proceso, texto y datos no se heredan. Las subrutinas times se ponen a 0. Las alarmas pendientes toman su valor inicial. Se eliminan las seales pendientes para el proceso hijo.

- Ejemplos:
/* fork.c - Ejecucin conjunta de procesos padre e hijo */ #include <stdio.h> #include <unistd.h> main () { printf ("Ejemplo de fork.\n"); printf ("Inicio del proceso padre. PID=%d\n", getpid ()); if (fork() == 0) { /* Proceso hijo */ printf ("Inicio proceso hijo. PID=%d, PPID=%d\n", getpid (), getppid ()); sleep (1); } else { /* Proceso padre */ printf ("Continuacin del padre. PID=%d\n", getpid ()); sleep (1); } printf ("Fin del proceso %d\n", getpid ()); exit (0); } Ejemplo de fork. Inicio proceso padre. PID=8153 Inicio proceso hijo. PID=6618, PPID=8153 Continuacin proceso padre. PID=8153 Fin del proceso 6618 Fin del proceso 8153

- Ejemplo:
/* fork_huerf.c - Ejemplo de proceso hurfano * #include <stdio.h> #include <unistd.h> main () { printf ("Ejemplo de proceso hurfano.\n"); printf ("Inicio del proceso padre. PID=%d\n", getpid ()); if (fork () == 0)

{ printf ("Inicio proceso hijo. PID=%d, PPID=%d\n", getpid (), getppid ()); sleep (1); printf ("El proceso queda hurfano. PID=%d PPID=%d\n", getpid (), getppid ()); } else printf ("Concinuacin del padre. PID=%d\n", getpid ()); printf ("Fin del proceso %d\n", getpid ()); exit (0); } Ejemplo de proceso hurfano. Inicio proceso padre. PID=11330 Inicio proceso hijo. PID=6467, PPID=11330 Continuacin proceso padre. PID=11330 Fin del proceso 11330 $punto indicativo> El proceso queda hurfano. PID=6467, PPID=1 Fin del proceso 6467 Notas: En el ejemplo, el proceso padre no espera la finalizacin del proceso hijo y termina antes que ste. Cuando un proceso queda hurfano, el proceso de iniciacin (init) se convierte en su padre. Una vez que finaliza el proceso padre, se devuelve el control al intrprete de comandos, de ah que aparezca el mensaje del "punto indicativo". El proceso hijo no deber mandar mensajes a la consola, como ocurre en este ejemplo.

1,3,2. Subrutinas wait y waitpid:


- Descripcin: Espera a que pare o termine un proceso hijo, permitiendo obtener sus estados de salida. Una seal no bloqueada o no ignorada puede reactivar el proceso padre. - Formato: #include <sys/wait.h> pid_t wait (estados) int *estados; pid_t wait ((void *) 0); pid_t waitpid (PID, estados, opciones) pid_t PID; int *estados, opciones; - Parmetros:< PID - PID del proceso o grupo de proceso. Sus valores son: -1: waitpid acta igual que wait, esperando cualquier hijo. >0: PID de un proceso hijo determinado. 0: para cualquier hijo con el mismo grupo de procesos que el padre. <-1: para cualquier hijo cuyo grupo de proceso sea igaul al valor absoluto de PID. WNOHANG: evita la suspensin del padre mientras est esperando a algn hijo.

opciones - Mscara de opciones. Sus bits son:

WUNTRACED: el padre obtiene informacin adicional si el hijo recibe alguna de las seales SIGTTIN, SIGTTOU, SIGSSTP o SIGTSTOP .

estados - Puntero a una tabla con los estados de salida de los procesos. - Devuelve: 0, si no ha terminado ningn proceso. - Macros: WIFSTOPPED (estado) /* !=0, si estado es de un hijo parado */ pid_t estado; int WSTOPSIG (estado) /* N de seal que ha causado la parada */ pid_t estado; WIFEXITED (estado) /* !=0, si estado es de salida normal */ pid_t estado; int WEXITSTATUS (estado) /* 8 bits bajos del estado de salida */ pid_t estado; WIFSIGNALED (estado) /* !=0, si estado es de salida anormal */ pid_t estado; int WTERMSIG (estado) /* N de saal que ha causado la slida */ pid_t estado; - Cometarios: a) Estas subrutinas pueden verse afectadas por la seal SIGCHLD (ver sigaction). b) La subrutina wait espera la terminacin de cualquier proceso hijo.

- Ejemplos:
/* waitpid.c - Esperar la terminacin de un proceso hijo */ #include <stdio.h> #include <signal.h> #include <sys/wait.h> main () { pid_t id_padre; pid_t id_hijo; int estado;

/* PID del proceso padre */ /* PID del proceso hijo */ /* Estado de salida */

printf ("Ejemplo de waitpid.\n"); printf ("Inicio proceso padre. PID=%d\n", getpid ()); id_padre = getpid (); if ((id_hijo = fork ()) == 0) { /* Proceso hijo */ printf ("Inicio proceso hijo. PID=%d, PPID=%d\n", getpid (), id_padre); sleep (3); printf ("Salida proceso hijo. PID=%d\n", getpid ()); exit (getpid () > id_padre); /* 1, si PID > PPID */ } else { signal (SIGINT, SIG_IGN); /* Ignorar CTRL-C */ while (waitpid (id_hijo, &estado, 0) != id_hijo); if (WIFSIGNALED (estado)) printf ("El proceso hijo ha recibido la seal %d\n", WTERMSIG (estado)); if (WIFEXITED (estado)) { printf ("Estado de salida del proceso hijo: %d\n", WEXITSTATUS (estado));

if (WEXITSTATUS (estado) == 1) printf ("PID hijo > PID padre.\n"); else printf ("PID padre > PID hijo.\n"); } printf ("Fin del proceso %d\n", getpid ()); exit (0); } Ejemplo de waitpid. Inicio proceso padre. PID=24213 Inicio proceso hijo. PID=31638, PPID=24213 Fin proceso hijo. PID=31638 Estado de salida del proceso hijo: 1 PID hijo > PID padre Fin del proceso 24213 La salida siguiente muestra el efecto de generar una seal de interrupcin pulsando [CTRL][C]. Dicha seal provoca la terminacin automtica del proceso hijo, mientras que el proceso padre la ignora (ver signal). Ejemplo de waitpid. Inicio proceso padre. PID=7240 Inicio proceso hijo. PID=5705, PPID=7240 ^CEl proceso hijo ha recibido la seal: 2 Fin del proceso 7240

1,4. Terminacin de un proceso.


1,4,1. Subrutina exit:
- Descripcin: Termina la ejecucin de un proceso. - Formato: #include <stdlib.h> void exit (estado) int estado; - Parmetro: Estado de salida del proceso. - Comentarios: a) El proceso de salida de un proceso es el siguiente: Llamada a la funcin _cleanup para limpiar las reas de E/S. Llamada a la subrutina especificada en la subrutina atexit. Llamada a la subrutina _exit para finalizar el proceso.

b) Si _cleanup no puede cancelar las peticiones de E/S asncrona, la aplicacin se bloquea hasta que se completen dichas peticiones. c) Se cierran todos los descriptores de fichero. d) Si el proceso padre est en espera (ver wait), se devuelve el valor de los 8 bits menos significativos del estado de salida. e) Se enva una seal SIGCHLD al proceso padre. La accin por defecto es ignorar esta seal. Si no se ignora, el proceso hijo puede quedar como proceso zombi. f) La salida de un proceso no provoca la terminacin de sus hijos. El PPID de los hijos ser el PPID del proceso init (1). g) Se eliminan los bloqueos de ficheros (ver fcntl). h) Si para un proceso perteneciente a un grupo hurfano, se envan las seales SIGHUP y SIGCONT a cada proceso del grupo de procesos hurfanos.

1,4,2. Subrutina atexit:


- Descripcin: Ejecuta una determinada funcin antes de la terminacin del proceso. - Formato: #include <sys/limits.h> int atexit (funcin) void (*funcin) (void); - Parmetro: Puntero a la funcin llamada. - Devuelve: 0: si no hay errores. - Comentarios: a) La funcin se ejecuta si se ha completado con xito la subrutina _cleanup.

- Ejemplo:
/* atexic.c - Ejecucin de una rutina al salir de un programa */ #include <stdio.h> #include <sys/limits.h> int bucle=0; void salida (); int main () { int n; atexit (salida); printf ("Ejemplo de atexit.\n"); for (bucle=1; bucle<255; bucle++) { n=rand (); printf ("%d-%d\t", bucle, n); if (n > 30000) exit (1); } exit (0); } void salida () { printf ("El bucle ha dado %d vueltas.\n"); printf ("Hasta luega Lucas.\n"); } Ejemplo de atexit. 1-16838 2-5758 3-10113 4-17515 5-31051 El bucle ha dado 5 vueltas. Hasta luego Lucas. /* Contador de vueltas del bucle */ /* Prototipo de la funcin de salida */

2. SEALES.
2,1. Conceptos generales.
Seal:

Evento que debe ser procesado y que puede interrumpir el flujo normal de un programa. Capturar una seal: Una seal puede asociarse con una funcin que procesa el evento que ha ocurrido. Ignorar una seal: El evento no interrumpe el flujo del programa. Las seales SIGINT y SIGSTOP no pueden ser ignoradas (ver tabla de seales). Accin por defecto: Proceso suministrado por el sistema para capturar la seal (ver tabla de seales). Alarma: Seal que es activada por los temporizadores del sistema. Error: Fallo o accin equivocada que puede provocar la terminacin del proceso. Error crtico: Error que provoca la salida inmediata del programa.

2,2. Lista de las seales ms importantes.


Nm. Nombre 1 SIGHUP 2 SIGINT 3 SIGQUIT1 4 SIGILL1 5 SIGTRAP1 6 SIGABRT1 8 SIGFPE1 9 SIGKILL1 10 SIGBUS1 11 SIGSEGV1 12 SIGSYS1 13 SIGPIPE 14 SIGALRM 15 SIGTERM 16 SIGURG2 17 SIGSTOP3 18 SIGTSTP3 19 SIGCONT4 20 SIGCHLD2 21 SIGTTIN3 22 SIGTTOU3 23 SIGIO2 24 SIGXCPU 25 SIGXFSZ 30 SIGUSR1 31 SIGUSR2 Comentarios Colgar. Generada al desconectar el terminar. Interrupcin. Generada por teclado. Salir. Generada por teclado. Instruccin ilegal. No se puede recapturar. Trazado. No se puede recapturar. Abortar proceso. Excepcin aritmtica, de coma flotante o divisin por cero. Matar proceso. No puede capturarse, ni ignorarse. Error en el bus. Violacin de segmentacin. Argumento errneo en llamada al sistema. Escritura en una tubera que otro proceso no lee. Alarma de reloj. Terminacin del programa. Urgencia en canal de E/S. Parada de proceso. No puede capturarse, ni ignorarse. Parada interactiva. Generada por teclado. Continuacin. Generada por teclado. Parada o salida de proceso hijo. Un proceso en 2o plano intenta leer del terminal. Un proceso en 2o plano intenta escribir en el terminal. Operacin de E/S posible o completada. Tiempo de UCP excedido. Excedido el lmite de tamao de fichero. Definida por el usuario nmero 1. Definida por el usuario nmero 2.

34 SIGVTALRM Alarma de tiempo virtual.

36 SIGPRE

Excepcin programada. Definida por el usuario.

Notas sobre la accin por defecto para la seal.


1. 2. 3. 4. Generar un fichero core. Ignorar la seal. Parar el proceso que recibe la seal. Reiniciar o continuar el proceso que recibe la seal.

Las seales comprendidas entre la 37 y la 58 (ambas inclusive) estn reservadas por el sistema.

El rango de seales en el UNIX de Berkeley (BSD) es de 1 a 31.

2,3. Capturar seales.


2,3,1. Subrutina signal:
- Descripcin: Asocia una accin determinada con una seal. - Formato: #include <signal.h> void (*signal (seal, accin)) () int seal; void (*accn) (); - Parmetros: seal: Nmero de seal, excepto SIGKILL. accin: Puntero a la rutina asociada con la seal o uno de los valores: SIG_DFL: accin por defecto para dicha seal. SIG_IGN: ignorar la seal,

- Devuelve: Valor de la accin anteriormente asociada; -1, en caso de error. - Comentarios: a) Existe una versin de la subrutina signal compatible con el UNIX de Berkeley (BSD). b) No se permiten mscaras de bloqueo de seales y se activa el bit SA_OLDSTYLE (ver >sigaction).

- Ejemplo:
/* signal.c - Contar el nmero de CTRL-C en 15 segundos */ #include <stdlib.h> #include <signal.h> int numcortes=0; int enbucle=1; void alarma (); void cortar (); /* Contador de CTRL-C */ /* Controlador de salida del bucle de espera */ /* Captura la seal de alarma SIGALRM */ /* Captura la seal de interrupcin SIGINT */

int main () { signal (SIGINT, cortar); signal (SIGALRM, alarma); printf ("Ejemplo de signal.\n");

printf ("Pulsa varias veces CTRL-C durante 15 segundos.\n"); alarm (15); while (bucle); signal (SIGINT, SIG_IGN); printf ("Has intentado cortar %d veces.\n", numcortes); printf ("Hasta luego Lucas.\n"); exit (0); } void alarma () { signal (SIGALRM, SIG_IGN); bucle=0; /* Salir del bucle */ printf ("Alarma!\n"); } void cortar () { signal (SIGINT, SIG_IGN); printf ("Has pulsado CTRL-C\n"); numcortes++; signal (SIGINT, cortar); } Ejemplo de signal. Pulsa CTRL-C varias veces durante 15 segundo. ^CHas pulsado CTRL-C ^CHas pulsado CTRL-C ^CHas pulsado CTRL-C ^CHas pulsado CTRL-C ^CHas pulsado CTRL-C Alarma! Has intentado cortar 5 veces. Hasta luego Lucas.

2,3,2. Subrutina sigaction:


- Descripcin: Especifica la accin a realizar cuando un proceso recibe una seal. - Formato: #include <signal.h> int sigaction (seal, accin, accin_salida) () int seal; struct sigaction *accn, *accin_salida; - Parmetros: seal: Nmero de seal, excepto SIGKILL. accin: Accin especificada cuando se recibe la seal. accin_salida: Accin a realizar cuando termine la funcin sigaction. - Campos de la estructura sigaction: void (*sa_handler) (); Puntero a la rutina asociada con la seal o uno de los valores: SIG_DFL: accin por defecto para dicha seal. SIG_IGN: ignorar la seal.

sigset_t sa_mask; Especifica la mscara de las seales que sern bloqueadas durante la captura de la seal especificada. int sa_flags;

SA_ONSTACK: La captura de la seal se realiza en una pila de seales en vez de en la pila del proceso. SA_OLDSTYLE: El parmetro seal se asocia con la acin por defecto (SIG_DFL) antes de llamar a la rutina de captura (no recomendable, la seal puede recurrir). SA_NOCLDSTOP: Evita que el proceso padre reciba una seal SIGCHLD cuando para el proceso hijo.

- Devuelve: 0, si es correcta; -1, en caso de error. - Comentarios: a) Las siguientes funciones pueden ser llamadas sin problemas desde una rutina de captura de seales: _exit access alarm chdir chmod chown close creat dup dup2 exec fcntl fork fstat getegid geteuid getgid getgroups getpgrp getpid getppid getuid kill link lseek mkdir mkfifo open pause pipe readx rename rmdir setgid setpgrp setuid sigaction sigaddset sigdelset sigfillset sigismember signal sigpending sigprocmask sigsuspend sleep statx tcdrain tcflow tcflush tcgetattr tcgetpgrp tcsendbreak tcsetattr tcsetpgrp time times umask uname unlink ustat utime write b) Una vez que una accin est instalada para una seal, contina hasta que haya otra llamada a sigaction o se llame a la subrutina exec, excepto si se ha activado el bit SA_OLDSTYLE. c) Las seales SIGKILL y SIGSTOP no pueden ser ignoradas.

2,3,3. Subrutina kill:


- Descripcin: Enva una seal a un proceso. - Formato: #include <signal.h> int kill (proceso, seal) pid_t proceso; int seal; - Parmetros: proceso: Identificador del proceso o del grupo de procesos que recibir la seal. Puede tomar los siguientes valores: >0: Identificador de un nico proceso. 0: Procesos cuyo identificador del grupo de procesos sea igual al PID del proceso actual. <-1: Procesos cuyo identificador del grupo de procesos sea igaul al valor absoluto de proceso.

seal: Nmero de seal enviada. - Devuelve: 0, si se ha completado correctamente; -1, en caso de error. - Comentarios: a) La subrutina raise enva una seal al proceso actual. #include <sys/signal.h> int raise (seal) int seal;

Este cdigo es equivalente al mostrado a continuacin: error = kill (getpid (), seal); b) La subrutina killpg enva una seal a un grupo de procesos. Esta subrutina es compatible con el UNIX de Berkeley (librera libbsd.a). #include <signal.h> int killpg (int grupo_procesos, int seal); El cdigo anterior equivale al mostrado a continuacin: if (grupo_procesos < 0) { errno = ESRCH; return (-1); } return (kill(-grupo_procesos, seal)); c) Para enviar una seal a otro proceso deben coincidir el identificador de usuario (UID) real o efactivo de ambos procesos, o que el proceso emisor tenga prioridad de usuario root.

- Ejemplo:
/* kill.c - Ejecucin con tiempo de espera usando kill */ #include <stdlib.h> #include <signal.h> int espera; void hijo (); /* Tiempo de espera */ /* Controlador de fin de proceso hijo */

int main (int contargs, char *args[]); { pid_t pid; if (contargs < 3) { printf ("Formato: %s segundos comando [opciones].\n", args[0]); exit (1); } printf ("Ejemplo de kill.\n"); printf ("Ejecucin con tiempo de espera.\n"); signal (SIGCHLD, hijo); pid = fork (); if (pid == 0) { execvp (args[2]; &args[2]); perror (args[0]); } else { espera = atoi (args[1]); sleep (espera); printf ("El hijo %d ha excedido el tiempo de %d s.\n", pid, espera); signal (SIGCHLD, SIG_IGN); kill (pid, SIGINT); } exit (1); } void espera ()

{ int id_hijo, est_hijo; id_hijo = wait (&est_hijo); printf ("El hijo %d ha terminado antes de %d s.\n", id_hijo, espera); exit (0); } $ kill.e 3 wc kill.c Ejemplo de kill. Ejecucin de un comando con tiempo de espera. 45 132 1065 kill.c El hijo 10489 ha terminado antes de 3 s. $ kill.e 3 sleep 5 Ejemplo de kill. Ejecucin de un comando con tiempo de espera. El hijo 10851 ha excedido el tiempo de espera de 3 s.

2,4. Alarmas y temporizadores.


2,4,1. Subrutinas alarm y ualarm:
- Descripcin: Genera alarmas de reloj (seal SIGALRM) para el proceso actual. - Formato #include <unistd.h> unsigned int alarm (segundos) unsigned int segundos; unsigned int ualarm (valor, intervalo) unsigned int valor, intervalo; - Parmetros: segundos: Nmero de segundos para enviar al proceso la seal SIGALRM. valor: Nmero de seales generadas. intervalo: Intervalo (en ms.) entre las seales. - Devuelve: alarm devuelve el nmero de segundos que restan para generar la seal. ualarm devuelve el nmero de microsegundos que restan hasta la prxima seal. - Comentarios: a) Slo puede generarse una nica alarma (no son aplilables). b) El parmetro intervalo no puede ser menor que 10 para un usuario sin privilegios. c) Estas 2 subrutinas son compatibles con las primeras versiones del AIX, con UNIX System V y con UNIX de Berkeley (BSD). En AIX, se han programado como llamadas a la subrutina incinterval.

- Ejemplo:
/* alarm.c - Esperar una alarma */ #include <stdlib.h> #include <unistd.h> int main () { printf ("Una alarma en 3 segundos.\n"); alarm (3); printf ("Esperando...\n"); while (1); printf ("Esta lnea no se ejecutar nunca.\n");

exit (0); } Una alarma en 3 segundos. Esperando... Alarm clock

2,5. Tratamiento de errores.


2,5,1. Lista de errores ms importantes.
Nm. Nombre 1 EPERM 2 ENOENT 3 ESRCH 4 EINTR 5 EIO 6 ENXIO 7 E2BIG 8 ENOEXEC 9 EBADF 10 ECHILD 11 EGAIN 12 ENOMEM 13 EACCES 14 EFAULT 15 ENOTBLK 16 EBUSY 17 EEXIST 18 EXDEV 19 ENODEV 20 ENOTDIR 21 EISDIR 22 EINVAL 23 ENFILE 24 EMFILE 26 ETXBUSY 27 EFBIG 28 ENOSPC 29 ESPIPE 30 EROFS 32 EPIPE 33 EDOM Descripcin Operacin no permitida. El archivo o directorio no existe. El proceso no existe. Llamada al sistema interrumpida. Error de E/S. No existe dispositivo o direccin. Lista de argumentos demasiado larga. Error en formato de ejecucin. Descriptor de fichero errneo. No existe el proceso hijo. Recurso no disponible temporalmente. No hay suficiente espacio de memoria. Permiso denegado. Direccin de memoria errnea. Se necesita un fichero de bloques. Recurso ocupado. Fichero existente. Enlace impropio. Dispositivo inexistente. No es un directorio. Es un directorio. Argumento no vlido. Demasiados ficheros abiertos en el sistema. Demasiados ficheros abiertos. Fichero de texto ocupado. Fichero demasiado largo. No queda espacio en el dispositivo. Bsqueda no vlida. Fichero slo de lectura. Tubera rota. Error de dominio matemtico.

34 ERANGE 88 EDQUOT

Resultado fuera de rango. Cuota de disco excedida.

78 ETIMEDOUT Excedido tiempo de conexin (NFS).

Nota: No se tratan aqu los errores relativos a comunicaciones, ni a sockets. 2,5,2. Subrutina perror:
- Descripcin: Escribe un mensaje explicando un error. - Formato: #include <errno.h> void perror (cadne) char *cadena; - Parmetro: Cadena de caracteres que explica el error. - Variables globales de errno.h: extern int errno; Nmero de error. extern char *sys_errlist[]; Tabla con la descripcin de los errores del sistema. - Comentarios: a) Se imprime en la salida normal con un formato equivalente a la siguiente orden: printf ("%s: %s\n", cadena, sys_errlist[errno]);

3. PIPES (TUBERAS).
3,1. Conceptos generales.
Descriptor de fichero: Nmero entero positivo usado por un proceso para identificar un fichero abierto. Esta traduccin se realiza mediante una tabla de descriptores de fichero, ubicado en la zona de datos del proceso. Descriptores reservados: 0: entrada normal (stdin). 1: salida normal (stdout). 2: salida de error (stderr).

Redireccin: Establecer copias del descriptor de ficheros de un archivo para encauzar las operaciones de E/S hacia otro fichero. Tubera: Mecanismo de intercomunicacin entre procesos que permite que 2 o ms procesos enven informacin a cualquier otro. Tubera sin nombre: Enlace de comunicacin unidireccional, capaz de almacenar su entrada (hasta 4 KB en BSD o hasta 40 KB en System V). Tuberas nombradas (FIFO): Permiten una comunicacin menos restringida, ya que las colas FIFO existen en el sistema de archivos hasta que son borradas. Caractersticas: Permite comunicar procesos no emparentados. Tiene una entrada en el sistema de archivos.

Usa una poltica de colas "primero en llegar, primero en servirse". Slo disponible en UNIX System V.

3,2. Redireccin.
3,2,1. Subrutinas dup y dup2:
- Descripcin: Duplica un descriptor de fichero. - Formatos: #include <unistd.h> #include <fcntl.h> #include <sys/types> int dup (desc_abierto) int desc_abierto; int dup2 (desc_abierto, desc_nuevo) int desc_abierto, desc_nuevo; - Parmetros: desc_abierto: Descriptor de fichero abierto. desc_nuevo: Nuevo descriptor de fichero devuelto por dup2. - Devuelve: dup devuelve el menor descriptor de fichero que est libre. dup2 devuelve el valor de desc_nuevo. Ambas subrutinas devuelven el valor -1 en caso de error. - Comentarios: a) Las subrutinas dup y dup2 son equivalentes a la subrutina fcntl de la siguiente forma: dup: fcntl (desc_abierto, F_DUPFD, 0); dup2: close (desc_nuevo); fcntl (desc_abierto, F_DUPFD, desc_nuevo); b) Puede redirigirse hacia un fichero cualquier descriptor especial.

- Ejemplo:
/* dup2.c - Redireccin usando dup2 */ #include <stdlib.h> #include <unistd.h> #include <fcntl.h> int main (int contargs, char *args[]) { int desc_fich; if contargs < 3) { printf ("Formato: %s fichero comando [opciones].\n", args[0]); exit (1); } printf ("Ejemplo de redireccin.\n"); desc_fich = open (args[1], O_CREAT|O_TRUNC|O_WRONLY, 0); dup2 (desc_fich, 1); /* Redirige la salida normal */ close (desc_fich); execvp (args[2], &args[2]; /* Ejecuta comando */ exit (1); } $ dup2.e dup2.sal ls *.c Ejemplo de redireccin.

$ chmod 600 dup2.sal; cat dup2.sal alarm.c atexit.c dup2.c exec.c fork.c fork_huerf.c lector_fifo.c pipe.c pipe_conec.c system.c waitpid.c

escritor_fifo.c kill.c signal.c

3,2,2. Subrutina fcntl:


- Descripcin: Realiza operaciones de control sobre ficheros abiertos, tales como: duplicar el descriptor, poner o leer caractersticas del descriptor, poner o leer estado del fichero, gestionar bloqueos de registros, gestionar la propiedad de la E/S asncrona, cerrar varios ficheros.

- Formato: #include <unistd.h> #include <fcntl.h> #include <sys/types> int fcntl (descriptor, comando, argumento) int descriptor, comando, argumento); - Parmetros: descriptor: Descriptor del fichero. comando: Operacin ha realizar. argumento: Parmetro del comando. - Devuelve: Valor devuelto por el comando; -1, en caso de error. - Operaciones: F_DUPFD: Obtener el menor descriptor de fichero disponible que sea mayor que el parmetro descriptor. Mantiene el mismo puntero y las mismas caractersticas del fichero original. F_GETFD: Obtener caractersticas del descriptor. F_SETFD: Poner caractersticas del descriptor. F_GETFL: Obtener estado del fichero. F_SETFL: Poner estado del fichero. F_GETLK: Obtener informacin de bloqueo. F_SETLK: Poner bloqueo. F_SETLKW: Poner bloqueo en una zona bloqueada. F_GETOWN: Obtener PID (>0) o PGID (<0) del proceso que recibe las seales SIGIO o SIGURG. F_SETOWN: Poner PID (>0) o PGID (<0) del proceso gestor de la E/S asncrona. F_CLOSEM: Cierra todos los descriptores desde descriptor hasta el valor mximo (OPEN_MAX). - Caractersticas del descriptor de ficheros: FD_CLOEXEC: Indica si el descriptor se cerrar ante una funcin exec. - Estados del modo de acceso al fichero: O_RDONLY: Abierto slo para lectura. O_RDWR: Abierto para lectura y escritura. O_WRONLY: Abierto slo para escritura.

- Bloqueos: F_RDLCK: Bloqueo de lectura (compartido). F_WRLCK: Bloqueo de escritura (exclusivo). F_UNLCK: Sin bloqueo. - Comentarios: a) Un bloqueo de lectura evita que otros procesos activen bloqueos de lectura en cualquier zona del rea protegida. S se permiten otros bloqueos de lectura en toda el rea o en partes de ella. b) Un bloqueo de escritura evita que otros procesos bloqueen dicha zona. c) Los "abrazos mortales" en un sistema distribuido no siempre son detectables. El programa deber usar temporizadores para poder liberar sus bloqueos.

3,3. Comunicacin entre procesos emparentados.


3,3,1. Subrutina pipe
- Descripcin: Crea un canal de comunicacin entre procesos emparentados. - Formato: #include <unistd.h> int pipe (descriptores) int descriptores[2]; - Parmetros: Tabla que recibir los descriptores de entrada y de salida de la tubera. - Devuelve: 0, si se ha completado correctamente; -1, en caso de error. - Comentarios: a) descriptores[0] se abre para lectura y descriptores[1], para escritura. b) La operacin de lectura en descriptores[0] accede a los datos escritos en descriptores[1] como en una cola FIFO (primero en llegar, primero en servirse),

- Ejemplos:
/* pipe.c - Tubera sin nombre entre procesos padre e hijo */ #include <stdlib.h> #include <unistd.h> #define LEER #define ESCRIBIR 0 1

int main () { int descr[2]; /* Descriptores de E y S de la turbera */ int bytesleidos; char mensaje[100], *frase="Veremos si la transferecia es buena."; printf ("Ejemplo de tubera entre padre e hijo.\n"); pipe (descr); if (fork () == 0) { close (descr[LEER]); write (descr[ESCRIBIR], frase, strlen(frase)); close (descr[ESCRIBIR]); } else { close (descr[ESCRIBIR]);

bytesleidos = read (descr[LEER], mensaje, 100); printf ("Bytes leidos: %d\n"); printf ("Mensaje: %s\n", bytesleidos, mensaje); close (descr[LEER]); } } Ejemplo de tubera entre padre e hijo. Bytes ledos: 36 Mensaje: Veremos si la transferencia es buena. /* pipe_conec.c - Tubera entre 2 comandos usando pipe. */ #include <stdlib.h> #include <unistd.h> #define LEER #define ESCRIBIR 0 1

int main (int contargs, char *args[]) { int descr[2]; /* Descriptores de E y S de la turbera */ if (contargs != 3) { printf ("Formato: %s comando_ent comando_sal.\n", args[0]); exit (1); } pipe (descr); if (fork () == 0) { close (descr[LEER]); dup2 (descr[ESCRIBIR], 1); close (descr[ESCRIBIR]); execlp (args[1], args[1], NULL); perror (args[0]); } else { close (descr[ESCRIBIR]); dup2 (descr[LEER], 0); close (descr[LEER]); execlp (args[2], args[2], NULL); perror (args[0]); } } $ pipe_conec.e ls wc 37 37 354

3,4. Comunicacin entre procesos no emparentados.


3,4,1. Subrutina mkfifo:
- Descripcin: Crea un canal FIFO de comunicaciones entre procesos que no necesitan estar emparentados. - Formato: #include <sys/mode.h> int mkfifo (camino, modo)

const char *camino; int modo; - Parmetros: camino: Camino completo del fichero FIFO. modo: Tipo de fichero y permisos de acceso. - Devuelve: 0, si se ha completado correctamente; -1, en caso de error. - Comentarios: a) La subrutina mkfifo es un interfaz de la rutina mknod para crear colas FIFO, las cuales no necesitan privilegios especiales del sistema. b) El comando ls -al identifica una tubera nombrada con el carcter descriptor p

- Ejemplos:
/* lector_fifo.c - Tuberia con nombre usando mkfifo */ #include <stdlib.h> #include <fcntl.h> #include <sys/mode.h> int linea (int df, char *cad); int main () { int descr; char cadena[100]; unlink ("tuberia"); mkfifo ("tuberia", 0); chmod ("tuberia", 460); descr = open ("tuberia", O_RDONLY); while (linea (descr, cadena)) printf ("%s\n", cadena); close (descr); pritnf ("Fin del lector.\n"); } int linea (int df, char *cad) { int n; do { n = read (df, cad, 1); } while (n > 0 && *cad++ != NULL); return (n > 0); }

#include <stdlib.h> #include <fcntl.h> #include <sys/mode.h> int main () { int descr, longmens, i;

char mensaje[100]; sprintf (mensaje, "Un saludo desde el proceso %d", getpid ()); longmens = strlen (mensaje) + 1; do { /* intentar la conexion */ descr = open ("tuberia", O_WRONLY); if (descr == -1) sleep (1); } while (descr == -1); for (i=0; i<3; i++) { write (descr, mensaje, longmens); sleep (3); } close (descr); printf "Fin del escritor %d\n", getpid ()); }

#!/bin/ksh # fifo - Carga los procesos lector y escritor en 2o plano. lector_fifo.e & escritor_fifo.e & escritor_fifo.e & $ fifo $Un saludo desde el proceso 11996 Un saludo desde el proceso 10971 Un saludo desde el proceso 11996 Un saludo desde el proceso 10971 Un saludo desde el proceso 11996 Un saludo desde el proceso 10971 Fin del escritor 10971 Fin del escritor 11996 Fin del lector

LINUX
Ordenes bsicas de la lnea de comandos

Resumen: Aunque despus de mucho tiempo de ser usuario de Linux a


uno le parezca un sistema amigable y potente, la primera impresin que suele recibir un usuario sin demasiados conocimientos de informtica no

es precisamente la de un "sistema amigable". En este artculo, el autor nos lleva de la mano por esos primeros momentos, ensendonos los conceptos, programas y "trucos" que todo usuario de UNIX necesita conocer. Introduccin
Este artculo va dedicado especialmente a los recin llegados a Linux (y a cualquier UNIX por extensin), aunque tambin creo puede resultar til para repasar algunos conceptos a los ya iniciados. Es muy posible que a alguno de nuestros lectores despus de comparse un ordenador solo lo utilice para poco ms que como procesador de textos, algn que otro juego y algn programa de contabilidad. El Sistema Operativo no sabe ni qu es, y se lo pusieron "gratis" (o eso le dijeron) al comprar el ordenador (generalmente hablamos del Windows 95), el resto de programas es posible que los haya obtenido de forma pirata, gracias al amigo de un conocido suyo, ya que no puede permitirse el lujo de gastarse tanto dinero en software. Desea que el ordenador haga el trabajo que quiere sin complicarse mucho la vida. Y le molesta bastante perder el trabajo que ha realizado cuando el ordenador le da mensajes crpticos como "Error de proteccin de memoria en 0FAG:BD07" pero no le de ms importancia ya que no conoce otra cosa. Un da llega a sus odos algo sobre un sistema operativo gratuito que no falla, que se llama "Linux", y decide probarlo comprando una revista especializada en informtica que contiene un CD con dicho sistema. Tras un enrevesado proceso de instalacin en el que tuvo que particionar su disco duro, cosa que por cierto no le gusto nada, para mantener una particin de Windows y dejar un pequeo espacio para Linux. Tras tenerlo todo listo arranca con el nuevo sistema operativo y se encuentra con algo como:
LILO: _

Ha ledo la documentacin y sabe que ahora se tiene que introducir el nombre que le di a la particin Linux. Tras varias pantallas de mensajes aparece algo similar a:
Red Hat linux 2.0.32 darkstar login: _

Ahora ha de introducir ahora "root" y luego la clave de acceso al sistema que usted asign durante la instalacin. Tras eso se encuentra con algo como:
root@darkstar:~# _

Ahora qu?

Cosas que se pueden hacer con Linux


Tras ver esta pantalla se preguntar sobre la utilidad de tanto esfuerzo. No parece que haya un sistema de ventanas o un interfaz grfico ms o menos decente. Una primera solucin para ese detalle es teclear la orden: startx Si usted ha configurado bien la tarjeta de vdeo durante el proceso de instalacin obtendr algo que quiz le resulta familiar. El siguiente paso es intentar sacar algo productivo de todo esto. Un paquete interesante es la suite StarOffice. Es una suite ofimtica, al igual que la de microsoft (R), con multitud de facilidades. Hay otro artculo en esta revista (procesador de texto, creacin de presentaciones) que trata este programa en detalle. Adems puede obtener una copia de l de forma gratuita en http://www.stardivision.com/. Ese paquete ofrece la solucin a la mayora de las necesidades que el usuario medio tiene. Aparte de ste, dispone de muchas aplicaciones ms:
editores de texto (jeo, vi, emacs,...) juegos de todo tipo (incluida una versin gratuita del Doom!) visores de grficos de todo tipo (xview, xdvi, xgv,...) reproductores de CD, Midi, pelculas MPEG (cdp, xmpeg) calculadoras en pantalla, programas de dibujo...

Estos son los programas para un usuario medio, aparte hay multitud de programas para usos especializados como programacin, CAD, anlisis matemtico, clculo cientfico, Internet, ... Muchos de estos programas funcionan bajo ese entorno de ventanas que ha encontrado, pero otros precisan de la lnea de comandos (interprete de ordenes) que se encontr al entrar en el sistema. Linux, como todos los UNIX, precisa de esa lnea de comandos ya que desde ella se puede realizar muchas labores que no precisan del entorno de ventanas o que es ms cmodo realizarlas desde ese sitio.

Administracin bsica del sistema


Todo usuario de ordenador siempre debe saber qu es lo que tiene en su disco duro y realizar trabajos de organizacin sobre las cosas que introduce en este. El indicador del sistema (en ingls prompt) es una herramienta ms til y ms flexible que el visor del sistema tpico de Windows. En adelante supondremos que el usuario tiene ciertos conocimientos de MSDOS o algn sistema operativo con interprete de comandos equivalente. El disco en Linux est organizado en ficheros. Los hay de diversas clases:

Ficheros ordinarios: que contienen informacin almacenada en nuestro trabajo o que usan otros programas. Directorios: son ficheros que contienen como de una carpeta se tratase otros ficheros, incluso otros directorios creando as una estructura jerarquizada. Enlaces: un fichero puede contener distintos nombres o estar accesible desde distintos directorios. Dispositivos: son ficheros a los se relaciona un dispositivo del ordenador (pantalla, disquete, disco duro, lectora de CD's, ...) de tal manera que si un programa desea actuar sobre ellos acta sobre estos ficheros. Tuberas y pilas: son ficheros especiales usados por los programas para comunicarse entre s.

Si teclea la orden pwd obtendr lo siguiente:


/root

Es el directorio actual donde se encuentra. Curioseemos un poco y vayamos al directorio raz -se llama as por que es el padre de todos los directorios y ficheros- con la orden: cd / Y ahora veamos que tenemos aqu, usemos el comando para lista el contenido del directorio : ls
# ls dev var sbin lib home bin boot proc lost+found dosc etc usr root mnt tmp

Aqu tenemos diversos directorios que veamos cual es su funcin:


Directorio dev home Funcin Contiene todos los ficheros de los dispositivos. Es el directorio para los usuarios. Pues s, Linux ofrece la capacidad de que varias personas acten a la vez sobre el mismo ordenador sin que interfieran los unos con los otros (es la cualidad de multiusuario). Un usuario nuevo se puede crear con el comando: adduser [nombre-usuario] (donde nombre-usuario puede ser pepito ). Es ms, le recomiendo que se cree uno propio para los trabajos tpicos y reserve root para las labores de administracin, ya que por ejemplo puede borrar accidentalmente todo los ficheros del disco duro como root, cosa que como usuario el sistema es imposible.

lost+found Ha tenido alguna vez que usar las utilidades norton para recuperar un fichero que haba perdido por algn cluster defectuoso. No se preocupe, si el disco duro falla es el propio sistema el que automticamente tratar de recuperar los ficheros, si el proceso de recuperacin no es capaz de averiguar de donde provenan los bloques encontrados los colocar aqu. Es una nota ms de porqu se dice que Linux es superior a cualquier producto de microsoft. root var bin dosc mnt S, lo ha adivinado, es el directorio de trabajo del super-usuario, al igual que home para los usuarios. Contiene diversos ficheros temporales para almacenar noticias del sistema, correo electrnico entre usuarios, las colas de impresorin... Aqu se encuentran los comandos ms importantes del sistema a la hora de administrarlo. Es posible que este directorio se llamase de otra forma en su computadora. Aqu puede acceder a la particin de windows (o MSDOS) Si desea acceder a un CD generalmente se usar este directorio para un proceso llamado

"montaje". De tal manera que si desea acceder a ellos deber usar la orden mount -t iso9660 /dev/cdrom /mnt. Es posible que esta orden difiera segn haya configurado el sistema. sbin boot etc Aqu estn los comandos de administracin avanzada que, por seguridad, no deben ser ejecutados por personas que no sean el super-usuario (root). Aqu se encuentra el ncleo del sistema (el corazn). En este directorio se encuentran ficheros de configuracin del sistema, as como el proceso de arranque del sistema o del entorno de ventanas (algo as como los ficheros CONFIG.SYS y AUTOEXEC.BAT). Este es usado por los programas como directorio temporal en los que introducen ficheros intermedios o basura. Generalmente el sistema los borra automticamente al arrancar. Directorio de bliblioteca bsicas del sistema. Linux es un sistema que para ahorrar memoria el cdigo que comparten muchos programas se introduce en un solo fichero, llamado bliblioteca, de tal manera que hay una sola copia de l en memoria si se est utilizando. Este es un directorio espejo de los programas que estn en memoria, es usado para que programas como ps, top o kill nos permitan ver qu programas se estn ejecutando en el sistema y (si se queda alguno colgado) eliminarlos de su ejecucin. Evitando como suele suceder en windows tener que reiniciar el sistema y perder todo lo que hacen los dems programas. Aqu van a estar los programas de aplicacin, as como su documentacin y blibliotecas.

tmp lib

proc

usr

Generalmente slo se tendr que gestionar los ficheros que estn sobre el directorio root o del usuario particular que use.

Como son los comandos


Linux es bsicamente un sistema operativo en el que la forma de interactuar con l reside en la lnea de comandos (aunque existe un entorno de ventanas llamado X que se pone en marcha, como hemos visto antes, con startx). Cuando el usuario entra en el sistema ver algo como esto:
root@darkstar: ~# _

ste es un tipico indicador del interprete de ordenes -este prompt se puede configurar a gusto del usuario-; su significado es el siguiente: el login del usuario en cuestin "root", una arroba "@", el nombre de la mquina "darkstar", dos puntos :, el directorio actual de trabajo (en este caso ~ quiere decir el directorio de trabajo del usuario, como hemos visto antes es /root/) ~, una almohadilla # que indica que tienes permisos de superusuario (o sea que tienes total control sobre la maquina y finalmente un cursor parpadeante. Tras ese cursor puedes introducir ordenes al ordenador a modo de comandos del sistema:
root@darkstar:~# ls -l pepito_

En este ejemplo vemos como el usuario ha introducido una orden que se compone de un comando (ls) una opcin para el comando (-l) y un parmetro (pepito). Cuando el usuario pulse retorno de carro, Linux listar el fichero pepito (o sea mostrar sus caractersticas como tamao, fecha de creacin, entre otra cosas que veremos ms en detalle posteriormente, por supuesto esto lo har si dicho fichero existe.

Linux, generalmente, slo acepta un comando seguido de un espacio (para distinguir cuando termina el comando) y las opciones separadas por espacios entre ellas.
ls -l -a pepito

Las opciones tambin pueden ir juntas de esta forma:


ls -la pepito

Por ltimo, se le pueden introducir tantos ficheros (parmetros) como se quieran separados de espacios
ls pepito juanito mara

Esto listar los ficheros pepito, juanito y mara sin tanto detalle como la hace con la opcin -l, si desea esos detalles slo hace falta ponerla entre el comando y los parmetros.
ls -l pepito juanito mara

Donde encontrar informacin


El sistema le brinda una gran cantidad de informacin acerca de cmo usar el sistema. Si conoce un comando y desea saber como se maneja, pruebe con:
man [comando]

En pantalla aparecer el mannual de uso del comando pedido. Existe toda una completa explicacin de casi todos los comandos del sistema. Conociendo la orden man no es necesario memorizar todos los parmetros de cada comando

Pgina del manual del comando man: man man

Si en cambio slo conoce un tema en concreto del que desee saber pruebe:
apropos [tema]

y le ofrecer un listado con todos los comandos relacionados con ese tema. Otra forma de obtener informacin sobre un comando concreto es pidiendolse directamente al comando. Algunos comandos dan informacin un poco ms breve y concisa dndole como parmetro --help. Por ejemplo con el comando ls
ls --help

Es posible que la salida de estos comandos no cupiese en una sla pantalla, no se preocupe con las teclas Mays+Repag podr ver lo listado anteriormente. Muchos programas ofrecen gran cantidad de informacin en sus directorio de documentacin localizados en /usr/doc. Si desea ver la informacin sobre tetex podr dirigirse a ella yendo a ese directorio, listando lo que hay en este y ver cual se corresponde con la utilidad tetex. Se accede a este con cd y all podr encontrar muchos ficheros (generalmente de texto plano ASCII) que se pueden visualizar por ejemplo con el comando more [nombre-fichero]. Tambin se puede encontrar informacin en la pginas info que se pueden acceder fcilmente desde el editor emacs con la secuencia de teclas [Control+h][Control+i]. Todava se puede encontrar ms informacin en la web en:
http://slug.ctv.es http://www.linux.org http://www.cs.us.es http://www.redhat.com http://www.debian.org

Tambin hay grupos de noticias bajo el protocolo nntp donde se habla extensamente de temas de linux:

news:es.comp.os.linux: grupo en espaol news:comp.os.linux.software: para preguntas sobre software news:comp.os.linux.hardware: para preguntas sobre configuraciones sobre un determinado hardware news:comp.os.linux.development: preguntas sobre programacin en Linux

Y por ltimo en irc-hispano se suele encontrar el canal #linux

Comandos bsicos de manejo de ficheros


Si ha conocido el DOS, recordara las ordenes dir, cd, rd, md y algunas otras ms. Aqu veremos las equivalentes para el proceso de manejar los ficheros que creamos. Siempre existe la posibilidad de ver con ms detalle lo que hace cada uno con man [comando].
ls:

lista el contenido del directorio

Ya hemos usado esta orden anteriormente. Completemos un poco ms el conocimiento de su uso: Si pedimos la orden:
$ ls -l drwxr-xr-x 3 drwx-----5 drwx-----2 drwxrwxr-x 2 lrwxrwxrwx 1 drwxrwxr-x 2 lrwxrwxrwx 1 -rw------1 lrwxrwxrwx 1 drwx-----2 -rw-rw-r-1 drwxrwxr-x 2 drwxr-xr-x 2 drwx-----2 drwxrwxr-x 2 drwxrwxr-x 8 lrwxrwxrwx 1 private/prolog -rw-r--r-1 drwxrwxr-x 4 lrwxrwxrwx 1 -rwxr-xr-x 1 fenix fenix fenix fenix root fenix root fenix root fenix fenix fenix fenix fenix fenix fenix root fenix fenix root fenix fenix fenix fenix fenix root fenix root fenix root fenix fenix fenix fenix fenix fenix fenix root fenix fenix root fenix 1024 1024 1024 1024 11 1024 9 868352 12 1024 302 1024 1024 1024 1024 1024 14 23051 1024 11 1239 Jun Nov May Mar Mar Mar Mar Apr Mar Jun Apr Mar Nov Mar Feb Mar Mar 15 6 16 10 13 10 13 7 13 13 7 10 6 12 17 12 13 1997 19:35 1997 00:28 20:53 00:28 20:53 21:19 20:53 1997 20:30 00:28 18:59 18:05 21:27 23:04 20:53 Calendar Desktop Mail X11 ada -> private/ada bin c -> private/c core lisp -> private/lisp mail mine.bmp misdocumentos nhs nsmail odd private prolog ->

Jan 27 21:14 system.fvwm2rc Mar 22 15:36 tmp Mar 13 20:53 www -> private/www Nov 6 19:46 xinitrc.bak

Esto es lo que se denomina un listado largo, en el que se nos ofrece una mayor cantidad de informacin acerca de los ficheros que contiene el directorio. Podemos diferenciar 6 campos: El primero nos ofrece informacin acerca de los permisos del fichero. Se componen de 10 letras divididas en 3 grupos de 3 y la primera de ellas. La primera letra nos ofrece informacin acerca del tipo de fichero:

- fichero ordinario d directorio l enlace fichero especial, dispositivo de caracteres: o sea slo se le puede mandar o recoger informacin byte a byte c sin posibilidad de volver a leer el mismo dato. fichero especial, dispositivo de bloques: estos dispositivos permiten realizar operaciones de posicionamiento b aleatorio. p tuberas f Pilas

Las restantes letras nos indican quin y de qu forma se puede acceder a ese fichero. Estn divididas en 3 grupos de 3 letras. Las tres primeras indican cmo puede actuar el usuario propietario sobre el fichero, el segundo trio corresponde al grupo (el usuario puede pertenecer a un grupo de trabajo de tal manera que los ficheros del grupo puedan ser compartidos por estos) y el tercer trio es el resto de los usuarios del systema (o el mundo) Cada grupo de 3 letras indica lo siguiente:
La primera puede estar como: - no se puede leer el fichero, si es un directorio no se podr listar su contenido. r se puede leer. La segunda nos indica:

no se puede escribir sobre el fichero (ni aadir informacin), si es un directorio no se podrn crear nuevos ficheros ni borrar otros sobre este. w se puede escribir (crear y borrar ficheros si es un directorio) La tercera: no se puede ejecutar el fichero (los programas tendrn una x), si es un directorio este no ser accesible (o sea no se podr acceder con la orden cd en l) x se puede ejecutar. Este artibuto slo tiene sentido en ficheros ejecutable. Independientemente del usuario que ejeute este programa, el programa se ejecutar con los permisos del propietario del fichero en lugar de los s permisos de usuario que lo ejecuta. No se preocupe si no ha entendido la utilidad del atributo "s", slo la necesitan usuarios muy avanzados. El nombre de ste es "SetUID". -

Estos permisos se pueden cambiar con la orden chmod que veremos posteriormente. El siguiente campo del listado es el nmero de enlaces que apuntan a este fichero. El siguiente es el usuario propietario del archivo. El cuarto nos indica el grupo al que pertenece, de tal manera que los que pertenezcan al mismo grupo podrn acceder a este segn los permisos de grupo asignados (segundo trio de permisos). El quinto nos da el tamao del fichero en bytes. El sexto es la fecha y la hora de la ltima modificacin del fichero Y por ltimo est el nombre del fichero. Si se trata de un enlace adems nos indica a qu fichero est referenciando con -> [origen]

Por otra parte tambin existen los ficheros ocultos en Linux. Estos se caracterizan por que su primer carcter en su nombre es un punto (.) Para poder listar los ficheros ocultos se usa la opcin -a con lo que tambin mostramos los ocultos aparte de todos los restantes ficheros.
$ ls -a .profile mime.bmp cp: .bash_profile misdocumentos .bashrc .xinitrc

copiar fichero

Este comando permite copiar ficheros para que tengan otro nombre o se encuentren en otro directorio. cp [fichero] [destino]

Si el destino si no es un directorio existente se interpretar que quieres copiar el fichero con otro nombre.
mv:

mover fichero

mv es "MoVe", o sea mover. Con esta orden puedes renombrar un fichero o cambiarlo de directorio. mv [fichero] [destino]

Si el destino no es un directorio existente querr decir que quieres renombrar el fichero.


cd: cd

cambia de directorio

Es casi igual al de MSDOS. Slo difiere en unas cuantas cosas:

sin argumentos te llevar al directorio inicial. Si eres el super-usuario te llevar al directorio /root/; si eres pepe /home/pepe. Como puedes ver, tambin aqu los directorios tienen la barra inclinada a la derecha (y no a la izquierda como en MSDOS) Por ltimo, /home puede ser substituido por el carcter ~ (este se obtiene con Altgr + 4). As cd ~pepe te llevar a /home/pepe
mkdir:

crea directorio

Es as de sencillo mkdir [nombre-de-directorio] y crea un directorio con ese nombre.


rmdir:

borra directorio vaco

Si deseas borrar un directorio que no contiene ficheros, este comando har dicha funcin con rmdir [nombre-fichero]. Si quieres borrar directorios que contengan ficheros (u otros directorios) mira la orden rm.
rm:

borra ficheros

Borra cualquier tipo de ficheros con rm [nombre-fichero].


Otras opciones importantes son: -i pide confirmacin para borrar el fichero.

-r borra un directorio y todo su contenido. -rf borra un directorio y sus contenidos sin pedir confirmacin. ln:

crea enlaces para los ficheros

Linux permite que un fichero tenga distinto nombre o que se pueda acceder a l desde un directorio distinto. Esto se realiza con enlaces. Los hay de dos tipos:
fsicos: que realizan un copia completa del contenido del fichero en el enlace, cuando el fichero origen se modifica tambin afecta al enlace y viceversa. simblicos: Estos no realizan dicha copia, tan solo los enlaces actan como si fuesen el fichero origen. De esta manera no se tiene que realizar la copia del contenido del fichero y as ocupar disco. En la actualidad ya casi slo se acta con este tipo de enlaces . Por otro lado los directorios slo permiten enlaces simblicos.

Los enlaces fsicos se realizan con: ln [fichero-origen] [fichero-destino] Y los simblicos con: ln -s [fichero-origen] [fichero-destino]
cat:

muestra el contenido del fichero

Esta orden muestra el contenido del fichero en pantalla.


cat [nombre-fichero] more:

muestra el contenido de un fichero de forma paginada

Si el fichero que queremos ver es muy largo (tiene ms lneas que la pantalla sobre la que lo queremos ver), se perdern las primeras lneas por la parte superior. Una solucin es utilizar el buffer de pantalla, sobre el que nos podemos desplazar con Mays+Repag. Pero este buffer es de un tamao limitado y en muchas ocasiones no nos servir. La orden more nos permite ver de forma paginada los ficheros. Su sintaxis es:
more [nombre-fichero]

Se trata de un programa interactivo. Las "teclas" (ordenes interactivas) ms interesantes son:


Tecla Espaciador Avanza una pgina b return Retrocede una pgina Avanza una lnea Funcin

/[cadena] Busca la siguiente aparicin de cadena en el fichero ?[cadena] Busca la anterior aparicin de cadena en el fichero q Salir

Existe un programa equivalente y ms avanzado llamado less.


chmod:

cambia los permisos de los ficheros

Con este podemos modificar cmo se puede acceder al fichero en cuestin. Un usuario normal (root puede hacer lo que quiera) slo puede modificar los permisos de los ficheros que es propietario. Se compone de 2 tipos de parmetros separados de un espacio.
chmod [quien][+/-] [permisos-nuevos] [fichero]

En quien podemos refirirnos a:


Quin u g o a Descripcin Usuario al que pertenece el archivo grupo al que pertenece el archivo resto de usuarios cualquier usuario (poseedor, grupo, otros)

Con + aadimos permisos y con - los retiramos. En permisos-nuevos indicamos qu permisos se aaden o se eliminan. Estos se caracterizan por las letras del primer campo de un listado largo con ls (o sea r:lectura, w:escritura, x:ejecucin o visita, s:SetUID) Veamos un ejemplo para aclarar
chmod u+rw mio

Con ste permitimos que el usuario propietario, usted en este caso, tenga permisos de lectura y escritura sobre el fichero mio.
chmod a-x directorio

Y con ste le retiramos a todos los usuarios (incluido nosotros, el propietario) el derecho de ser visitado a directorio tiene otras opciones ms avanzadas, que no veremos aqu, consulte la pgina de manual con el comando:
chmod man chmod

Comodines para ficheros:


Linux permite que se pueda actuar sobre un conjunto de ficheros en vez de uno a uno. Podemos referirnos a un conunto de ficheros que tengan alguna caracterstica comn en su nombre. Esto se consigue con el uso de comodines a la hora de dar argumentos a los comandos. Algunos pueden resultar conocidos del mundo MS-DOS:

(arterisco): Se refiere a cualquier cadena de caracteres (de 0 o ms componentes)

Con el asterisco podemos refirirnos a:

rm *

borrar todos los ficheros


rm a*

borrar todos los ficheros que comienzen con a


rm bet*as

borrar todos los ficheros que comienzen con bet y terminen con as

(interrogante): cualquier carcter (uno solo)

Con la interrogacin podemos conseguir:


cat c?t

mostrar todos los ficheros que comienzen por c, que contenga una letra cualquiera ms y terminen con t.

[ ]
grupo

: cualquier grupo de caracteres contenidos en los corchetes

De este forma podemos referirnos a:


more [tp]erez

mostrar de forma pginada los ficheros terez y perez, si es que existen.


cp c[AEIOU]endo directorio

copiar todos los que empiecen por c que tenga despus una letra vocal mayscula y terminen en endo y meterlos en el directorio. Podemos usar un guin para crear intervalos:
mv *[a-z] basura

mover todos los ficheros que terminen en letra minscula al directorio basura. ATENCIN: esto no incluye a la letra ee y las vocales acentuadas (ya se sabe que esto de la informtica es cosa de ingleses y ellos mandan) Tambin podemos negar lo que haya en el intervalo:
ls [!a-zA-Z]*

listar todos los ficheros que no contengan en su primera letra una letra mayscula o minscula.

Redirecciones
Linux es extremadamente potente por multitud de razones pero una de las utilidades que le permiten una gran versatilidad en la lnea de comandos reside en las redirecciones. Las redirecciones nos permiten redirigir la salida de un comando o programa para que en lugar de salir a pantallan, se enve a un fichero. Tambin, aunque ms raramente, podemos verter el contenido de un fichero para que lo acepte como entrada otro comando, podemos concatenar la salida de un comando a un fichero y por ltimo podemos conseguir que la salida de un comando sea entrada de otro.

>

(mayor que): redireccin a derecha

Con el smbolo mayor que podemos verter la salida de un programa a un fichero. Por ejemplo:
cal > febrero

As conseguimos que la salida del comando cal -en este caso un calendario con el mes actual en curso- al fichero febrero.

<

(menor que); redireccin a izquierda

Con el smbolo menor que podemos redirigir el contenido de un fichero para que lo acepte como entrada un comando.
mail manolo < carta

Con esto le mandamos por correo electrnico al usuario manolo el fichero carta

>>

(dos veces mayor que): concatenar al final

Los dobles mayor que nos permiten la posibilidad de que la salida del comando se aada al final del fichero en cuestin, sin destruir el contenido que antes haba en el fichero. Con la redireccin mayor que simple, el contenido original del fichero era reemplazado por la salida del comando, por tanto se perdia el contenido original de ste.
cat fichero1 fichero2 fichero3 >> fichero-total

Aadimos (concatenamos)al final de fichero-total los contenidos de los fichero1, fichero2 y fichero3. En otras palabras.

(barra vartical): tubera entre comandos

Este smbolo, obtenido con AltGr+1, nos permite que la salida de un comando sea la entrada de otro. No hay que confundir la redireccin de tubera con los ficheros especiales de tubera, a efectos prcticos son dos cosas distintas. Veamos un ejemplo:
who | grep "manolo"

nos indica los usuarios que se encuentran en el sistema conectados, desde qu terminales estn y hora de conexin. grep va a filtrar esa salida de tal manera que slo nos mostrar las lneas que contengan manolo. Sabemos que manolo es el nombre de un usuario con el que queremos hablar y en nuestro sistema no hay ninguna terminal que se llame manolo, gracias a esto podemos saber si manolo est conectado en el sistema.
who

Vemoslo paso a paso. Primero ejecute en su linux el comando who y luego ejecute who, pasandole una tubera con un grep y un usuario conectado (probablemente root). Para que el resultado sea satisfactorio conectese con varios usuarios de nombres distintos desde varias consolas. Linux dispone de un total de 7 consolas que se pueden acceder desde el ordenador que va actuar de servidor (generalmente donde ha instalado linux). Adems Linux permite conectarse desde otros ordenadores haciendo uso de hardware de red comn como token-ring, ethernet, modem, etc.. Las consolas del ordenador servidor pueden acederse con las teclas Alt+F1 (para la primera), Ctrl+Alt+F2 (segunda), Ctrl+Alt+F3, Ctrl+Alt+F4, Ctrl+Alt+F5 y Ctrl+Alt+F6. Ctrl+Alt+F7 y Ctrl+Alt+F8 son las terminales grficas, que se activan con startx. Es posible cambiar del modo grfico a una cosola de texto con estas combinaciones.

Editores de texto
Por ltimo, precisamos de los editores de texto. Los editores de texto son los programas que nos permiten introducir texto, en formato ASCII, en un fichero. Respecto al uso de editores hay casi autenticas religiones fanticas sobre quin es ms hombre dependiendo del editor que use :-). Yo por mi parte te recomiendo que uses el que te resulte ms cmodo. Editores hay muchos, veamos un breve resumen.
cat: el mismo comando para mostrar ficheros nos permite crear ficheros con el contenido que deseemos. slo es preciso no indicarle ningn parametro y redirigir la salida ( en este caso lo que nosotros vamos a introducir) a un fichero. $ cat > carta Querido pepe:

Deseaba decirte que... Se termina de escribir con la secuencia de teclas [Ctrl]+[d]. ed, ex: son editores de lneas semejantes al edlin del MSDOS. A pesar de ser antiguos an siguen teniendo vigencia ya que sus funciones pueden ser llamadas por otros programas con facilidad. vi: es el editor estndar por defecto en el mundo unix. Est garantizado su existencia en cualquier Unix al que te conectes. Es un editor a pantalla completa muy arisco y con una curva de aprendizaje pronunciada lo que hace que sea detestado por muchos. En cambio es imprescindible tener unos conocimientos bsicos de ste ya que a parte de encontrase en cualquier mquina unix del mundo

tambin puede ayudarte a salir de un aprieto en caso de que hagas una trastada en la configuracin del sistema y tengas que hacer uso del disquete de arranque de instalacin de Linux para resolverlo, en ese caso slo dispondrs del vi. En futuros captulos de esta serie veremos con detalle este editor. joe: es el editor ms cmodo en entorno de texto que conozco. Est inspirado en el funcionamiento del editor Word-star o los turbo editores de Borland (Turbo C, Turbo Pascal, ...). En cambio tiene serios problemas de compatibilidad con los teclados y los monitores que provoca que no funcione correctamente en todos los terminales, impidiendo as que sea un estndar. Debido a su facilidad de uso te recomiendo que empieces con ste.

Versin grfica del popular EMACS (XEMACS). emacs: este editor fue el primer programa de la GNU, creado por Richard Stallman con el fin de crear software libre accesible a todos los usuarios sin que se les restrinja el derecho a copiar los programas. Fue la base de todo lo que luego sera el sistema GNU (compiladores, utilidades de ficheros, depuradores de cdigo, ...) y que a su vez, que ms tarde formara parte fundamental del Linux. En le prximo pase de esta serie echaremos un vistazo a las utilidades de ficheros de GNU. Emacs es probablemente el editor de textos ms grande que se conoce tiene prcticamente de todo: acceso a compiladores, depuradores, correo electrnico, web, noticias usenet, el juego de torres de hanoi, calendario con fases lunares y hasta un psicoanalista. Es difcil para los usuarios acostumbrados a otros editores, sobre todo a los que vienen del mundo MS-DOS (usese mejor el joe), adems su tamao es gigantesco tambin en memoria lo que hace que sea desesperadamente lento para sistemas con poca memoria o muy cargados. Tambin dispone de versiones para X como el xemacs.

Con esto termina el primer artculo sobre administracin bsica del sistema. En el prximo veremos con detalle las utilidades de ficheros GNU y en el siguiente tratar de hablar sobre los editores ms comunes en Linux (el vi y el joe).

Вам также может понравиться