Pregunta 1 1a. Investigar que hace el comando split. Implementarlo con llamadas creat,open, read, write, close. 1b. Dada la siguiente estrucutura de datos: struct registro { unsigned int llave; char nombre[64]; char apellido_paterno[64]; char apellido_materno[64]; unsigned int edad; unsigned double sueldo; }; Hacer los siguientes programas: a) Crear un archivo vacio denominado basedatos.dat b) Que lea de entrada estandar una serie de lineas, donde cada linea contiene informacion de un registro de una persona. Cada campo del registro debe ser separado por coma. Y se debe almacenar cada registro en la estructura registro y guardar dicha estructura en el archivo basedatos.dat c) Un programa que busque en el archivo basedatos.dat un registro dada la llave o nombre o apellido_paterno o apellido_materno o edad o suedlo, e imprima todas las ocurrencias d) Un programa que imprima el numero de registros en la base de datos. e) Un programa que imprimima un registro, indicando el numero de registro. Usar llamadas creat, read, write, open, close, lseek. 1c. Usando el concepto de sockets UNIX (investigar, tema V) hacer los siguientes programas. a) Un programa que cree un socket UNIX en una ruta determinada por el usuario. b) Un programa que se convierta en un proceso servidor, que lea el socket y escriba lo que lea del socket a un archivo denominada salidasocket c) Un programa cliente, que lea un archivo de texto y lo escriba al socket. 1d. Hacer un programa UNIX que de manera recursiva imprima, a partir de un directorio inicial, todos los subdirectorios y archivos que esten bajo el. Usar llamadas como opendir,readdir,closedir, stat. Por cada archivo que encuente, que indique si es un archivo, directorio u otro. 1e. Investigar la funcion system. Implantar una funcion que se llame mysystem, usando fork y execlp, (Nota:Usar sh -c comando, para ejecutar cualquier comando solicitado) 1f. Hacer un programa denominado mrsmhit. Dicho programa debe lanzar 5 procesos hijos. Por cada proceso, escribir en una linea, su PID, en un archivo denominado smith.txt. Cada proceso hijo debe ejecutar sleep 24h. Cuando los 5 hijos mueran, debe volver a lanzar otros 5. Hacer otro programa denominado mranderson, que tome el archivo smith.txt, lea cada linea, para matar a cada proceso, conociendo su PID. Usar las llamadas fork, execl, kill, open, read, write para implantar los programas 1g. En el libro "El lenguaje de programacion C", en el punto 8.7 se describe como escribir un asignador de memoria, usando la llamada al sistema. Escribir ese codigo. Para probarlo, escribir un programa que use listas simplemente ligadas. 1h. Para resolver el siguiente problema, se deben investigar las llamadas de semaforos, memoria compartida o colas de mensajes (tema VI) El problema del barbero durmiente. Una peluqueria consta de una sala de espera con n sillas, y un cuarto con una silla de barbero. Si no hay clientes a quienes atender, el barbero se pone a dormir. Si un cliente entra a la peluqueria y todas las sillas estan ocupadas, abandona la peluqueria. Si el barbero esta ocupado, pero hay sillas disponibles, entonces el cliente se sienta en una de las sillas libres. Si el barbero esta dormido, el cliente despierta al barbero. Escribir un programa denominado peluqueria,barbero y otro denominado clientes, para llevar a cabo este problema. El programa peluqueria debe inicializar todos los IPCS que se necesiten El programa barbero debe dormir, despertarse o atender clientes. El programa clientes debe generar un cliente cada x segundos, donde x es un numero aleatorio. Notas: El barbero se puede dormir y despertar usando un semaforo o un mensaje. Las sillas se pueden representar como un arreglo de n. Cada vez que un cliente ocupe una silla (entrada del arreglo), debe guardar su PID). El codigo que maneje las sillas debe considerarse como seccion critica. El cliente cuando despierte al barbero, debe usar el mismo semaforo que el barbero o dirigir un mensaje al barbero. Pregunta 2 2a En el directorio /tmp/fotos se tienen los siguientes archivos (copiados de una camara digital): [root@localhost fotos]# ls -l total 0 -rw-r--r-- 1 root root 0 Nov 20 17:23 dscf0001.jpg -rw-r--r-- 1 root root 0 Nov 20 17:24 dscf0002.jpg -rw-r--r-- 1 root root 0 Nov 20 17:25 dscf0003.jpg -rw-r--r-- 1 root root 0 Nov 20 17:26 dscf0004.jpg -rw-r--r-- 1 root root 0 Nov 20 17:27 dscf0006.jpg -rw-r--r-- 1 root root 0 Nov 20 17:28 dscf0007.jpg -rw-r--r-- 1 root root 0 Nov 20 17:29 dscf0008.jpg -rw-r--r-- 1 root root 0 Nov 20 17:30 dscf0009.jpg -rw-r--r-- 1 root root 0 Nov 20 17:31 dscf0010.jpg -rw-r--r-- 1 root root 0 Nov 20 17:32 dscf0011.jpg -rw-r--r-- 1 root root 0 Nov 20 17:33 dscf0012.jpg -rw-r--r-- 1 root root 0 Nov 20 17:34 dscf0013.jpg -rw-r--r-- 1 root root 0 Nov 20 17:35 dscf0014.jpg -rw-r--r-- 1 root root 0 Nov 20 17:36 dscf0015.jpg -rw-r--r-- 1 root root 0 Nov 20 17:37 dscf0016.jpg -rw-r--r-- 1 root root 0 Nov 20 17:38 dscf0018.jpg -rw-r--r-- 1 root root 0 Nov 20 17:39 dscf0019.jpg -rw-r--r-- 1 root root 0 Nov 20 17:40 dscf0020.jpg Para hacer que los nombres de los archivos sean mas descriptivos haga un script en shell que copie dichos archivos al directorio /tmp/cib51200 (substituya cib51200 por su cuenta) cambiandoles el nombre de tal forma que dscf0001.jpg quede como Nov20-01.jpg, dscf0002.jpg quede como Nov20-02.jpg y asi sucesivamente, al final debera de quedar algo como: [root@localhost cib51200]# ls -l total 0 -rw-r--r-- 1 root root 0 Nov 20 18:07 Nov20-01.jpg -rw-r--r-- 1 root root 0 Nov 20 18:07 Nov20-02.jpg -rw-r--r-- 1 root root 0 Nov 20 18:07 Nov20-03.jpg -rw-r--r-- 1 root root 0 Nov 20 18:07 Nov20-04.jpg -rw-r--r-- 1 root root 0 Nov 20 18:07 Nov20-06.jpg -rw-r--r-- 1 root root 0 Nov 20 18:07 Nov20-07.jpg -rw-r--r-- 1 root root 0 Nov 20 18:07 Nov20-08.jpg -rw-r--r-- 1 root root 0 Nov 20 18:07 Nov20-09.jpg -rw-r--r-- 1 root root 0 Nov 20 18:07 Nov20-10.jpg -rw-r--r-- 1 root root 0 Nov 20 18:07 Nov20-11.jpg -rw-r--r-- 1 root root 0 Nov 20 18:07 Nov20-12.jpg -rw-r--r-- 1 root root 0 Nov 20 18:07 Nov20-13.jpg -rw-r--r-- 1 root root 0 Nov 20 18:07 Nov20-14.jpg -rw-r--r-- 1 root root 0 Nov 20 18:07 Nov20-15.jpg -rw-r--r-- 1 root root 0 Nov 20 18:07 Nov20-16.jpg -rw-r--r-- 1 root root 0 Nov 20 18:07 Nov20-18.jpg -rw-r--r-- 1 root root 0 Nov 20 18:07 Nov20-19.jpg -rw-r--r-- 1 root root 0 Nov 20 18:07 Nov20-20.jpg NOTA: EL NOMBRE DE LOS NUEVOS ARCHIVOS DEBERA FORMARSE DE LA SIGUIENTE MANERA: MES Y DIA DE MODIFICACION DEL ARCHIVO ORIGINAL SEGUIDOS DE UN GUION, DESPUES LOS DOS ULTIMOS DIGITOS DEL NOMBRE ORIGINAL Y FINALMENTE LA EXTENSION .jpg 2b Crear un script en shell que pueda recibir como parametro las siguientes opciones: start - cuando el script reciba este parametro debera dejar ejecutando en background el comando vmstat 5 >/tmp/cib51200.log (reemplazar cib51200 por su cuenta) stop - al recibir este parametro debera matar el proceso del comando que dejo ejecutando con el parametro start. Se debe considerar que el proceso a matar debe ser el propio y no el de otros usuarios que pudieran estar ejecutando el mismo comando. status - al recibir este parametro debera imprimir el PID del proceso que dejo ejecutando con el parametro start. si recibe cualquier otra opcion debera marcar que hay un error de sintaxis e indicar las tres opciones validas.