Perché non riesco a eseguire questo programma C?


12

Sto cercando di eseguire il mio primo programma "process", ma viene visualizzato il seguente errore:

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

Sono abbastanza sicuro che il codice sia corretto:

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

Che c'è?


15
Solo per il bene della tua sanità mentale più tardi, metti una "pausa"; sulla riga "case -1:". Ti ringrazierai per questo in seguito. Inoltre, fare in modo che il processo figlio chiami _exit (0) e l'uscita chiamata principale (0).
Bruce Ediger,

4
@BruceEdiger Perché la necessità di _exit? Cosa c'è di sbagliato nel fare una pulizia che è stata registrata?
OrangeDog,

4
exit (0) eliminerà stdout e stderr. _exit (0) no. Puoi finire con doppie uscite se ci sono dei byte su stdout quando il tuo programma fa il fork () e il figlio chiama exit (0). Perché stai imparando come funziona fork () perché confonderti?
Bruce Ediger,

@BruceEdiger apprendere come fork()funziona include imparare a copiare l'output buffer. Essendo una chiamata di sistema ragionevolmente complicata, è probabilmente necessaria una certa confusione nel processo di apprendimento.
OrangeDog

Risposte:


67

Non puoi semplicemente correre ./fork.c. Non è un programma; è la fonte di un programma. L'utilizzo ./presuppone che il file sia uno script (che non lo è) e lo tratta di conseguenza.

Tuttavia, come indicato in un'altra risposta, esistono compilatori (come il compilatore C minuscolo ) che possono eseguire il codice C senza compilarlo esplicitamente.

Dato che è un programma C, devi compilare il programma. Prova cc -o fork fork.cquindi ./fork; ha funzionato qui.


E se sei su Linux, probabilmente è GCC, non CC.
Linuxios,

6
@Linuxios nella maggior parte dei sistemi Linux, ccè un collegamento simbolico a gcc.
Renan,

Buono a sapersi. Anche se indica qualcos'altro su sistemi come Slaris, giusto?
Linuxios,

1
Ho appena controllato un paio di caselle di Solaris e sono /usr/bin/cccollegate a /opt/SUNWspro/bin/ccuna e /opt/sunstudio12.1/bin/ccall'altra. Indipendentemente da ciò, è ancora un compilatore C.
OrangeDog,

1
E su una scatola HPUX lo è /opt/ansic/bin/cc.
OrangeDog

23

Questo non è un programma, è il codice sorgente di un programma.

C è un linguaggio compilato , il che significa che deve essere "compilato" in istruzioni leggibili automaticamente prima di poterlo eseguire. Mentre stai usando C, il "compilatore C" ( cc) può farlo.

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

Passando a programmi più complicati, utilizzando più file sorgente e librerie esterne, passerai probabilmente all'utilizzo della "Collezione di compilatori GNU" ( gcc) e makedescriverai come trasformare il codice sorgente in un eseguibile funzionante.

Questa domanda contiene varie informazioni sulla differenza tra gli script (mentre si sta tentando di trattare il codice sorgente) e i programmi compilati.


Se "compilatore" fa parte del nome dello strumento, lo definirei ragionevolmente esplicito.
OrangeDog,

Solo una nota che gli strumenti che ho nominato non sono gli unici disponibili, ma sono probabilmente disponibili per impostazione predefinita su un sistema GNU / Linux e sono ampiamente utilizzati.
OrangeDog,

4
Per quanto riguarda la parola "must", tcc( Tiny C Compiler ) può eseguire il codice C senza compilarlo esplicitamente. pastebin.com/5FZiMpEn (commento modificato aggiungendolo nuovamente. Ci scusiamo per il disordine dell'ordine.)
manatwork
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.