Ejercicios Resueltos de Programación de Sistemas: Bash, C y Comandos Linux
Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones
Escrito el en
español con un tamaño de 5,34 KB
Fundamentos de Sistemas Operativos y Programación
Manipulación de Archivos en Linux: Creación y Ordenamiento
Ejercicio 1: Listado de los comandos que emplearías para crear un fichero llamado hola.txt, insertar dentro tres líneas con los contenidos “uno, dos y tres” y luego ordenarlas alfabéticamente con el programa sort. Intenta usar el mínimo número de comandos.
Solución Óptima (Mínimo de Comandos)
Utilizando echo y tuberías (pipes) para generar el contenido, ordenarlo y redirigir la salida al archivo:
echo -e "uno\ndos\ntres" | sort > hola.txt(Nota: La respuesta original proporcionada, que involucraba nano y sort -t hola, no es la forma más eficiente ni automatizable para esta tarea.)
Uso de Expresiones Regulares con Grep
Ejercicio 2: El siguiente listado muestra ejemplos de patrones o expresiones regulares utilizados con el comando grep. Se corrigen y estructuran los ejemplos de sintaxis:
grep -i 'conjuntocaracteres' file1: Búsqueda insensible a mayúsculas/minúsculas de un conjunto de caracteres dentro defile1.grep '^g' text: Búsqueda de líneas que comienzan con la letra 'g' (uso del ancla^).grep '[[:digit:]]' file: Búsqueda de líneas que contienen al menos un dígito (clase de caracteres[:digit:]).grep '^c' file1: Búsqueda de líneas que comienzan con la letra 'c'.
Programación Shell (Bash)
P2: Script para Determinar Tipo de Parámetro (Archivo o Directorio)
Ejercicio 3: Escribir un script que, al pasarle un parámetro por argumento, determine si es un archivo, un directorio, o si el parámetro no existe.
#!/bin/bash
# Este script recibe un argumento y determina si es archivo o directorio.
Error() {
echo "Error. Sintaxis de uso: $0 <archivo | directorio>"
}
if [ $# -lt 1 ]; then
# Si el número de parámetros posicionales o argumentos es menor de uno
Error
elif [ -d "$1" ]; then
# Si el parámetro posicional "$1" existe y es un directorio.
echo "$1 es un directorio."
elif [ -f "$1" ]; then
# Si el parámetro posicional "$1" existe y es un archivo regular.
echo "$1 es un archivo."
else
echo "$1 no existe."
fiProgramación de Sistemas en C
P1: Creación y Sincronización de Procesos (fork y wait)
Ejercicio 4: Escribir un programa que cree un proceso hijo. El hijo debe escribir “Soy el hijo” diez veces. El padre debe escribir “Soy el padre” diez veces. El padre debe esperar a que termine el hijo y mostrar el mensaje “Mi proceso hijo ya ha terminado”.
#include <stdio.h> // Añadido para printf
#include <stdlib.h>
#include <unistd.h> // Añadido para fork
#include <sys/wait.h> // Añadido para wait
int main() {
int pid;
int i;
int estado;
pid = fork();
switch(pid) {
case -1: // Si pid es -1, quiere decir que ha habido un error
perror("No se ha podido crear el proceso hijo\n");
break;
case 0: // Cuando pid es cero, quiere decir que es el proceso hijo
for(i = 0; i < 10; i++) {
printf("Soy el hijo\n");
}
exit(0); // Buena práctica para terminar el hijo
break;
default: // Cuando es distinto de cero, es el padre
for(i = 0; i < 10; i++) {
printf("Soy el padre\n");
}
// La función wait detiene el proceso padre y espera que termine el hijo.
// Se utiliza wait(&estado) para capturar el estado de salida.
wait(&estado);
printf("Mi proceso hijo ya ha terminado.\n");
break;
}
return 0;
}Ejemplo 5: Creación de un Proceso Zombi (zombi.c)
Un proceso zombi ocurre cuando un proceso hijo termina, pero su entrada en la tabla de procesos aún existe porque el proceso padre no ha llamado a wait() para recoger su estado de salida. En este ejemplo, el padre duerme 60 segundos mientras el hijo termina inmediatamente, creando un estado zombi temporal.
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main () {
pid_t child_pid;
/* Create a child process. */
child_pid = fork ();
if (child_pid > 0) {
/* This is the parent process. Sleep for a minute. */
sleep (60);
} else {
/* This is the child process. Exit immediately. */
exit (0);
}
return 0;
}Ejemplo 6: Configuración de Sockets (socket-inet.c)
Fragmento de código que muestra las inclusiones necesarias y el inicio de una función para obtener una página web utilizando sockets de Internet (AF_INET).
#include <stdlib.h>
#include <stdio.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
void get_home_page (int socket_fd) {
char buffer[10000];
ssize_t number_characters_read;
// ... (código incompleto en el original)
}