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.