Warum kann ich dieses C-Programm nicht ausführen?


12

Ich versuche, mein erstes "Prozess" -Programm auszuführen, erhalte jedoch die folgende Fehlermeldung:

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

Ich bin mir ziemlich sicher, dass der Code korrekt ist:

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

Was ist falsch?


15
Machen Sie nur aus Gründen Ihrer eigenen Gesundheit später eine "Pause". in der Zeile "case -1:". Sie werden sich später dafür bedanken. Lassen Sie außerdem den untergeordneten Prozess _exit (0) und den übergeordneten Call-Exit (0) aufrufen.
Bruce Ediger

4
@BruceEdiger Warum ist das nötig _exit? Was ist falsch daran, eine registrierte Bereinigung durchzuführen?
OrangeDog

4
exit (0) spült stdout und stderr. _exit (0) wird nicht. Sie können doppelte Ausgaben erhalten, wenn stdout einige Bytes enthält, wenn Ihr Programm die Verzweigung () ausführt und das Kind exit (0) aufruft. Weil Sie lernen, wie fork () funktioniert, warum sollten Sie sich verwirren?
Bruce Ediger

Das Erlernen der Funktionsweise von @BruceEdiger fork()umfasst das Erlernen, dass es gepufferte Ausgaben kopieren kann. Da es sich um einen einigermaßen komplizierten Systemaufruf handelt, ist im Lernprozess wahrscheinlich eine gewisse Verwirrung erforderlich.
OrangeDog

Antworten:


67

Du kannst nicht einfach rennen ./fork.c. Es ist kein Programm; Es ist die Quelle für ein Programm. Verwenden./ davon , dass die Datei ein Skript ist (was nicht der Fall ist), und sie wird entsprechend behandelt.

Wie in einer anderen Antwort erwähnt, gibt es jedoch Compiler (wie Tiny C Compiler) ), die C-Code ausführen können, ohne ihn explizit zu kompilieren.

Da es sich um ein C-Programm handelt, müssen Sie das Programm kompilieren. Versuchen Sie es cc -o fork fork.cdann ./fork; es hat hier funktioniert.


Und wenn Sie unter Linux arbeiten, handelt es sich wahrscheinlich um GCC, nicht um CC.
Linuxios

6
@Linuxios ist in den meisten Linux-Systemen cceine symbolische Verknüpfung zu gcc.
Renan

Gut zu wissen. Obwohl es auf Systemen wie Slaris auf etwas anderes hinweist, oder?
Linuxios

1
So überprüft ein paar Solaris - Boxen, und /usr/bin/ccLinks zu /opt/SUNWspro/bin/ccauf der einen und /opt/sunstudio12.1/bin/ccauf der anderen Seite . Unabhängig davon ist es immer noch ein C-Compiler.
OrangeDog

1
Und auf einer HPUX-Box ist es /opt/ansic/bin/cc.
OrangeDog

23

Das ist kein Programm, das ist der Quellcode für ein Programm.

C ist eine kompilierte Sprache, dh sie muss in maschinenlesbare Anweisungen "kompiliert" werden, bevor Sie sie ausführen können. Da Sie C verwenden, kann der "C Compiler" ( cc) dies tun.

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

Wenn Sie zu komplizierteren Programmen übergehen, die mehrere Quelldateien und externe Bibliotheken verwenden, werden Sie wahrscheinlich die "GNU Compiler Collection" ( gcc) verwenden und makebeschreiben, wie Sie den Quellcode in eine funktionierende ausführbare Datei verwandeln.

Diese Frage enthält verschiedene Informationen zum Unterschied zwischen Skripten (während Sie versuchen, Ihren Quellcode zu behandeln) und kompilierten Programmen.


Wenn "Compiler" Teil des Werkzeugnamens ist, würde ich das ziemlich explizit nennen.
OrangeDog

Nur ein Hinweis, dass die von mir genannten Tools nicht die einzigen sind, die verfügbar sind, sondern wahrscheinlich standardmäßig auf einem GNU / Linux-System verfügbar sind und weit verbreitet sind.
OrangeDog

4
In Bezug auf dieses "Muss" -Wort kann tcc( Tiny C Compiler ) C-Code ausführen, ohne ihn explizit zu kompilieren. pastebin.com/5FZiMpEn (Kommentar durch erneutes Hinzufügen bearbeitet. Entschuldigung, dass Sie die Bestellung
durcheinander
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.