Dlaczego nie mogę uruchomić tego programu C?

12

Próbuję uruchomić mój pierwszy program „procesowy”, ale pojawia się następujący błąd:

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

Jestem prawie pewien, że kod jest poprawny:

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

Co jest nie tak?

Silnik
źródło
15
Ze względu na własne zdrowie psychiczne, później „przełam”; w wierszu „case -1:”. Podziękujesz sobie za to później. Niech również potomne wywołanie procesu _exit (0) i wyjście wywołania nadrzędnego (0).
Bruce Ediger,
4
@BruceEdiger Dlaczego potrzeba _exit? Co jest złego w robieniu zarejestrowanego czyszczenia?
OrangeDog,
4
exit (0) opróżni stdout i stderr. _exit (0) nie będzie. Możesz skończyć z podwójnymi wyjściami, jeśli na standardowym wyjściu jest kilka bajtów, gdy twój program robi fork (), a dziecko wywołuje exit (0). Ponieważ uczysz się, jak działa fork (), po co się mylić?
Bruce Ediger,
@BruceEdiger uczenie się, jak fork()działa, obejmuje uczenie się, że może kopiować buforowane dane wyjściowe. Będąc dość skomplikowanym wywołaniem systemowym, pewna dezorientacja jest prawdopodobnie konieczna w procesie uczenia się.
OrangeDog,

Odpowiedzi:

67

Nie możesz tak po prostu biec ./fork.c. To nie jest program; jest źródłem programu. Użycie ./zakłada, że ​​plik jest skryptem (którym nie jest) i odpowiednio go traktuje.

Jednak, jak zauważono w innej odpowiedzi, istnieją kompilatory (takie jak Tiny C Compiler ), które mogą wykonywać kod C bez jawnej kompilacji.

Ponieważ jest to program typu C, musisz go skompilować. Spróbuj cc -o fork fork.cwtedy ./fork; działało tutaj.

Renan
źródło
A jeśli używasz Linuksa, prawdopodobnie jest to GCC, a nie CC.
Linuxios,
6
@Linuxios w większości systemów Linux ccjest dowiązaniem symbolicznym gcc.
Renan,
Dobrze wiedzieć. Chociaż wskazuje na coś innego w systemach takich jak Slaris, prawda?
Linuxios,
1
Właśnie zaznaczyłem kilka pól Solaris i /usr/bin/cclinki do /opt/SUNWspro/bin/ccjednego i /opt/sunstudio12.1/bin/ccdrugiego. Niezależnie od tego nadal jest to kompilator C.
OrangeDog
1
A na pudełku HPUX jest to /opt/ansic/bin/cc.
OrangeDog,
23

To nie jest program, to kod źródłowy programu.

C jest językiem kompilowanym , co oznacza, że ​​musi zostać „skompilowany” w instrukcje do odczytu maszynowego, zanim będzie można go uruchomić. Podczas używania C „Kompilator C” ( cc) może to zrobić.

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

Przechodząc do bardziej skomplikowanych programów, używając wielu plików źródłowych i bibliotek zewnętrznych, prawdopodobnie przejdziesz do korzystania z „GNU Compiler Collection” ( gcc) i makeopisania, jak zamienić kod źródłowy w działający plik wykonywalny.

To pytanie zawiera różne informacje na temat różnicy między skryptami (gdy próbujesz traktować swój kod źródłowy) a skompilowanymi programami.

OrangeDog
źródło
Jeśli „kompilator” jest częścią nazwy narzędzia, nazwałbym to rozsądnie wyraźnym.
OrangeDog,
Tylko uwaga, że ​​wymienione przeze mnie narzędzia nie są jedynymi dostępnymi, ale prawdopodobnie będą domyślnie dostępne w systemie GNU / Linux i są szeroko stosowane.
OrangeDog,
4
Biorąc pod uwagę, że słowo „musi”, tcc( Kompilator Tiny C ) może wykonać kod C bez jego jawnej kompilacji. pastebin.com/5FZiMpEn (Edytowano komentarz, dodając go ponownie. Przepraszam za
zepsucie