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:

  1. grep -i 'conjuntocaracteres' file1: Búsqueda insensible a mayúsculas/minúsculas de un conjunto de caracteres dentro de file1.
  2. grep '^g' text: Búsqueda de líneas que comienzan con la letra 'g' (uso del ancla ^).
  3. grep '[[:digit:]]' file: Búsqueda de líneas que contienen al menos un dígito (clase de caracteres [:digit:]).
  4. 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."
fi

Programació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)
}

Entradas relacionadas: