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?

Motor
fonte
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.

Renan
fonte
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.

OrangeDog
fonte
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