¿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?


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í.


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.