Академический Документы
Профессиональный Документы
Культура Документы
4.
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:
5.
3. PIPES (TUBERAS).
1. 2.
3.
4.
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).
- 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
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
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);
PPID 1 3638
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
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.
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
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.
- 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.
36 SIGPRE
Las seales comprendidas entre la 37 y la 58 (ambas inclusive) estn reservadas por el sistema.
- 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.
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.
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.
- 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");
34 ERANGE 88 EDQUOT
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
- 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.
- 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
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
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?
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.
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.
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
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.
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
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
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
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
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]
cambia de directorio
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
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
-r borra un directorio y todo su contenido. -rf borra un directorio y sus contenidos sin pedir confirmacin. ln:
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:
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]
/[cadena] Busca la siguiente aparicin de cadena en el fichero ?[cadena] Busca la anterior aparicin de cadena en el fichero q Salir
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]
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
rm *
borrar todos los ficheros que comienzen con bet y terminen con as
mostrar todos los ficheros que comienzen por c, que contenga una letra cualquiera ms y terminen con t.
[ ]
grupo
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.
>
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.
<
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
>>
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.
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).