Por que não consigo executar este programa C?


12

Estou tentando executar o meu primeiro programa "processo", mas recebo o seguinte erro:

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

Tenho certeza de que o código está correto:

 #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);
}

O que está errado?


15
Só por sua própria sanidade, mais tarde, faça uma "pausa"; na linha "case -1:". Você se agradecerá por isso mais tarde. Além disso, faça com que o processo filho chame _exit (0) e a chamada pai saia (0).
— precisa

4
@BruceEdiger Por que a necessidade _exit? O que há de errado em fazer qualquer limpeza registrada?
— OrangeDog

4
exit (0) liberará stdout e stderr. _exit (0) não. Você pode terminar com saídas duplas se houver alguns bytes no stdout quando o programa executar o fork () e o filho chamar exit (0). Porque você está aprendendo como o fork () funciona, por que se confundir?
— 22612 Bruce Ediger

O aprendizado do @BruceEdiger como fork()funciona inclui o aprendizado de que ele pode copiar a saída em buffer. Sendo uma chamada de sistema razoavelmente complicada, provavelmente é necessária alguma confusão no processo de aprendizado.
— OrangeDog

Respostas:


67

Você não pode simplesmente correr ./fork.c. Não é um programa; é a fonte de um programa. O uso ./assume que o arquivo é um script (o que não é) e o trata adequadamente.

No entanto, conforme observado em outra resposta, existem compiladores (como o Tiny C Compiler ) que podem executar o código C sem compilá-lo explicitamente.

Como é um programa em C, você precisa compilar o programa. Tente cc -o fork fork.centão ./fork; funcionou aqui.


E se você estiver no Linux, provavelmente é o GCC, não o CC.
— Linuxios 13/08/12

6
O @Linuxios, na maioria dos sistemas Linux, ccé um link simbólico para gcc.
— Renan

Bom saber. Embora aponte para outra coisa em sistemas como o Slaris, certo?
— Linuxios 13/08/12

1
Apenas marquei algumas caixas do Solaris e os /usr/bin/cclinks para /opt/SUNWspro/bin/ccum e /opt/sunstudio12.1/bin/ccoutro. Independentemente disso, ainda é um compilador C.
— OrangeDog

1
E em uma caixa HPUX é /opt/ansic/bin/cc.
— OrangeDog

23

Isso não é um programa, é o código fonte de um programa.

C é uma linguagem compilada , o que significa que deve ser "compilada" em instruções legíveis por máquina para que você possa executá-la. Como você está usando C, o "C Compiler" ( cc) pode fazer isso.

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

À medida que você avança para programas mais complicados, usando vários arquivos de origem e bibliotecas externas, você provavelmente continuará usando a "Coleção GNU Compiler" ( gcc) e makedescrever como transformar o código fonte em um executável.

Esta pergunta possui várias informações sobre a diferença entre scripts (como você está tentando tratar seu código-fonte) e programas compilados.


Se "compilador" fizer parte do nome da ferramenta, eu chamaria isso razoavelmente explícito.
— OrangeDog

Apenas uma observação de que as ferramentas que eu nomeei não são as únicas disponíveis, mas provavelmente estarão disponíveis por padrão em um sistema GNU / Linux e são amplamente utilizadas.
— OrangeDog

4
Com relação à palavra "must", tcc( Tiny C Compiler ) pode executar o código C sem compilá-lo explicitamente. pastebin.com/5FZiMpEn (comentário Editado por re acrescentando-it Desculpe por estragar a ordem..)
— manatwork
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.