C online

Compila y ejecuta C en tu navegador, sin instalar gcc: varios ficheros con sus .h, scanf con la entrada preparada, el error de compilación marcado en su línea y hasta procesos con fork() e hilos con pthread, imitados para que practiques lo de IC2 desde el móvil. Es el mismo entorno del simulacro práctico de IC2.

Cómo se usa

  • Ficheros: una pestaña por fichero. Con + creas uno nuevo; con el lápiz (o un doble clic en su nombre) lo renombras, y con la cruz lo borras (pide una segunda pulsación). Los .h se incluyen con #include "notas.h", como en tu ordenador.
  • Ejecutar compila todos los .c (el que tiene main, el último) y ejecuta el programa. Si no compila, el error sale en la Consola con su fichero y su línea, que se marca en el editor.
  • Entrada: lo que leerán scanf y fgets, una línea por cada lectura, y en la consola verás lo leído como si lo hubieras tecleado. No es interactivo: escribe los datos antes de ejecutar.
  • Tu código se guarda solo en este navegador. Con Descargar te llevas el fichero abierto y con .zip, todos, listos para compilarlos con gcc en tu Linux. Con Subir añades tus .c, .h o ficheros de datos (.txt) que tu programa puede abrir con fopen u open.
  • Compartir crea un enlace con tu código dentro: quien lo abra ve tus ficheros tal cual. El código va en el propio enlace, no se guarda en la web.
  • Ayudas activa o quita las sugerencias, el cierre de paréntesis, los colores extra y la línea del error marcada: sin ellas trabajas como con gedit en el examen. El botón de ampliar (arriba a la derecha) pone el entorno a pantalla entera y A− / A+ cambian el tamaño de la letra.

Procesos e hilos en el navegador

El navegador no tiene un Linux debajo, así que el entorno imita lo que se usa en IC2:

  • fork() crea un proceso hijo con su propia memoria: si el hijo cambia una variable, el padre no se entera, como en Fedora. Funcionan getpid(), getppid() (un hijo huérfano pasa a tener de padre el 1), wait, waitpid, exit y WEXITSTATUS. El programa siempre es el proceso 4310 y sus hijos, 4311, 4312…
  • sleep y usleep no te hacen esperar de verdad (como mucho unos segundos), pero la salida sale en el orden del reloj: lo que el padre imprime después de su wait aparece después de lo que imprime el hijo antes de terminar.
  • Los hilos (pthread_create, pthread_join, pthread_exit y los mutex) se ejecutan uno detrás de otro, así que aquí no verás una condición de carrera: para eso, tu Fedora. Si main termina sin pthread_join, el entorno te avisa de que los hilos no han llegado a ejecutarse.
  • No hay exec, tuberías, señales ni ps o pstree: esas capturas, en tu Linux.

Pega esto en el entorno y ejecútalo:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

int main() {
    int x = 10;
    pid_t pid = fork();

    if (pid == 0) {
        x = 99;   // solo cambia la x del hijo
        printf("Hijo %d (padre %d): x = %d\n", getpid(), getppid(), x);
        sleep(2);
        exit(3);
    }

    int estado;
    wait(&estado);
    printf("Padre %d: mi hijo devolvió %d y mi x sigue valiendo %d\n", getpid(), WEXITSTATUS(estado), x);
    return 0;
}

Qué puedes hacer y qué no

  • Compila con xcc, un compilador de C escrito para WebAssembly (de código abierto, licencia MIT), con su biblioteca estándar: stdio.h, stdlib.h, string.h, math.h, ctype.h, ficheros con fopen y con open/read/write, malloc y free.
  • Es más estricto que gcc en algunas cosas: un scanf("%d", x) sin & no compila (en gcc solo es un aviso, y luego el programa se rompe).
  • Avisa de los errores que en Fedora serían un Segmentation fault: un índice fuera de un vector, un puntero NULL o una recursión que no termina, con su línea.
  • Cada ejecución puede durar como mucho 15 segundos: un bucle infinito se para solo, y también tienes el botón Parar.
  • La primera vez descarga el compilador (medio mega); después arranca al momento.

Practica con él