¿Por qué no puedo ejecutar este programa C?

12

Estoy tratando de ejecutar mi primer programa de "proceso", pero aparece el siguiente error:

./fork.c: line 4: syntax error near unexpected token `('
./fork.c: line 4: `int main()'

Estoy bastante seguro de que el código es correcto:

 #include <sys/types.h>
 #include <stdio.h>
 int main() {
     pid_t pid;
     printf("Hello fork()\n");
     switch(pid=fork())  {
         case -1: printf("Error by fork().....\n"); exit(0);
         case 0: printf("I'm the child process \n"); break;
         default: printf("I'm the dad \n"); break;
     }
  exit(0);
}

¿Qué está mal?

Motor
fuente
15
Solo por su propia cordura más tarde, ponga un "descanso"; en la línea "caso -1:". Te lo agradecerás más tarde. Además, haga que el proceso secundario llame a _exit (0) y que la llamada principal salga (0).
Bruce Ediger
44
@BruceEdiger ¿Por qué la necesidad _exit? ¿Qué hay de malo en hacer una limpieza que ha sido registrada?
OrangeDog
44
la salida (0) vaciará stdout y stderr. _exit (0) no lo hará. Puede terminar con salidas dobles si hay algunos bytes en stdout cuando su programa hace la bifurcación (), y el niño llama a exit (0). Porque estás aprendiendo cómo funciona fork () ¿por qué confundirte?
Bruce Ediger
@BruceEdiger aprender cómo fork()funciona incluye aprender que puede copiar resultados almacenados en búfer. Al ser una llamada al sistema razonablemente complicada, probablemente sea necesaria cierta confusión en el proceso de aprendizaje.
OrangeDog

Respuestas:

67

No puedes simplemente correr ./fork.c. No es un programa; Es la fuente de un programa. El uso ./supone que el archivo es un script (que no lo es) y lo trata en consecuencia.

Sin embargo, como se señaló en otra respuesta, hay compiladores (como Tiny C Compiler ) que pueden ejecutar código C sin compilarlo explícitamente.

Como es un programa en C, debe compilar el programa. Intenta cc -o fork fork.centonces ./fork; Funcionó aquí.

Renan
fuente
Y si estás en Linux, probablemente sea GCC, no CC.
Linuxios
66
@Linuxios en la mayoría de los sistemas Linux, cces un enlace simbólico a gcc.
Renan
Bueno saber. Aunque apunta a algo más en sistemas como Slaris, ¿verdad?
Linuxios
1
Acabo de marcar un par de casillas de Solaris y /usr/bin/ccenlaces a /opt/SUNWspro/bin/ccuno y /opt/sunstudio12.1/bin/ccal otro. De todos modos, sigue siendo un compilador de C.
OrangeDog
1
Y en una caja HPUX es /opt/ansic/bin/cc.
OrangeDog
23

Ese no es un programa, ese es el código fuente de un programa.

C es un lenguaje compilado , lo que significa que debe "compilarse" en instrucciones legibles por máquina antes de poder ejecutarlo. Como está utilizando C, el "Compilador de C" ( cc) puede hacer esto.

cc -o fork for.c   # compile the code
chmod +x fork      # ensure it it executable
./fork             # run the compiled program

A medida que avanza hacia programas más complicados, utilizando múltiples archivos fuente y bibliotecas externas, es probable que continúe utilizando la "Colección del compilador GNU" ( gcc) y makedescriba cómo convertir el código fuente en un ejecutable que funcione.

Esta pregunta tiene información variada sobre la diferencia entre los scripts (ya que está tratando de tratar su código fuente) y los programas compilados.

OrangeDog
fuente
Si "compilador" es parte del nombre de la herramienta, lo llamaría razonablemente explícito.
OrangeDog
Solo una nota de que las herramientas que mencioné no son las únicas disponibles, sino que es probable que estén disponibles de forma predeterminada en un sistema GNU / Linux y se utilicen ampliamente.
OrangeDog
44
Con respecto a esa palabra "imprescindible", tcc( Tiny C Compiler ) puede ejecutar código C sin compilarlo explícitamente. pastebin.com/5FZiMpEn (Comentario editado volviendo a agregarlo. Perdón por alterar el orden)
manatwork