Pourquoi ne puis-je pas exécuter ce programme C?


12

J'essaie d'exécuter mon premier programme "processus", mais j'obtiens l'erreur suivante:

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

Je suis presque sûr que le code est correct:

 #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-ce qui ne va pas?


15
Juste pour votre propre santé mentale plus tard, mettez une «pause»; sur la ligne "case -1:". Vous vous en remercierez plus tard. Demandez également au processus enfant d'appeler _exit (0) et à l'appel parent exit (0).
Bruce Ediger

4
@BruceEdiger Pourquoi le besoin _exit? Quel est le problème avec un nettoyage enregistré?
OrangeDog

4
exit (0) videra stdout et stderr. _exit (0) ne le sera pas. Vous pouvez vous retrouver avec des sorties doubles s'il y a quelques octets sur stdout lorsque votre programme fait le fork () et que l'enfant appelle exit (0). Parce que vous apprenez comment fork () fonctionne, pourquoi vous embrouiller?
Bruce Ediger

@BruceEdiger apprendre comment fork()fonctionne comprend apprendre qu'il peut copier la sortie en mémoire tampon. Étant un appel système raisonnablement compliqué, une certaine confusion est probablement nécessaire dans le processus d'apprentissage.
OrangeDog

Réponses:


67

Vous ne pouvez pas simplement courir ./fork.c. Ce n'est pas un programme; c'est la source d'un programme. L'utilisation ./suppose que le fichier est un script (ce qui n'est pas le cas) et le traite en conséquence.

Cependant, comme indiqué dans une autre réponse, il existe des compilateurs (comme Tiny C Compiler ) qui peuvent exécuter du code C sans le compiler explicitement.

Puisqu'il s'agit d'un programme C, vous devez compiler le programme. Essayez cc -o fork fork.calors ./fork; cela a fonctionné ici.


Et si vous êtes sous Linux, c'est probablement GCC, pas CC.
Linuxios

6
@Linuxios dans la plupart des systèmes Linux, ccest un lien symbolique vers gcc.
Renan

Bon à savoir. Bien qu'il pointe vers autre chose sur des systèmes comme Slaris, non?
Linuxios

1
Je viens de cocher quelques cases Solaris et les /usr/bin/ccliens vers l' /opt/SUNWspro/bin/ccune et /opt/sunstudio12.1/bin/ccl'autre. Quoi qu'il en soit, c'est toujours un compilateur C.
OrangeDog

1
Et sur une boîte HPUX, c'est /opt/ansic/bin/cc.
OrangeDog

23

Ce n'est pas un programme, c'est le code source d'un programme.

C est un langage compilé , ce qui signifie qu'il doit être "compilé" en instructions lisibles par machine avant de pouvoir l'exécuter. Lorsque vous utilisez C, le "C Compiler" ( cc) peut le faire.

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

Au fur et à mesure que vous passez à des programmes plus compliqués, en utilisant plusieurs fichiers source et bibliothèques externes, vous passerez probablement à l'utilisation de la «Collection de compilateurs GNU» ( gcc) et makepour décrire comment transformer le code source en un exécutable fonctionnel.

Cette question contient diverses informations sur la différence entre les scripts (lorsque vous essayez de traiter votre code source) et les programmes compilés.


Si "compilateur" fait partie du nom de l'outil, je l'appellerais raisonnablement explicite.
OrangeDog

Juste une note que les outils que j'ai nommés ne sont pas les seuls disponibles, mais sont susceptibles d'être disponibles par défaut sur un système GNU / Linux et sont largement utilisés.
OrangeDog

4
Concernant ce mot "must", tcc( Tiny C Compiler ) peut exécuter du code C sans le compiler explicitement. pastebin.com/5FZiMpEn (Commentaire
modifié en l'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.