Mengapa saya tidak bisa menjalankan program C ini?


12

Saya mencoba menjalankan program "proses" pertama saya, tetapi saya mendapatkan kesalahan berikut:

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

Saya cukup yakin bahwa kodenya benar:

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

Apa yang salah?


15
Hanya demi kewarasan Anda sendiri nanti, letakkan "istirahat;" pada baris "case -1:". Anda akan berterima kasih pada diri sendiri untuk nanti. Juga, mintalah anak memproses panggilan _exit (0), dan panggilan induk keluar (0).
Bruce Ediger

4
@BruceEdiger Mengapa perlu _exit? Apa yang salah dengan melakukan pembersihan yang telah didaftarkan?
OrangeDog

4
keluar (0) akan menyiram stdout dan stderr. _exit (0) tidak akan. Anda dapat berakhir dengan keluaran ganda jika ada beberapa byte pada stdout ketika program Anda melakukan fork (), dan panggilan anak keluar (0). Karena Anda mempelajari cara kerja fork (), mengapa membingungkan diri sendiri?
Bruce Ediger

@BruceEdiger mempelajari cara fork()kerjanya termasuk belajar bahwa ia dapat menyalin output buffered. Menjadi panggilan sistem yang cukup rumit, beberapa kebingungan mungkin diperlukan dalam proses pembelajaran.
OrangeDog

Jawaban:


67

Anda tidak bisa lari begitu saja ./fork.c. Ini bukan program; itu sumber untuk suatu program. Menggunakan ./asumsi bahwa file tersebut adalah skrip (yang bukan) dan memperlakukannya sesuai.

Namun, seperti disebutkan dalam jawaban lain, ada kompiler (seperti Tiny C Compiler ) yang dapat mengeksekusi kode C tanpa secara eksplisit mengompilasinya.

Karena ini adalah program C, Anda harus mengkompilasi program tersebut. Coba cc -o fork fork.ckemudian ./fork; ini bekerja di sini.


Dan jika Anda menggunakan Linux, itu mungkin GCC, bukan CC.
Linuxios

6
@Linuxios di sebagian besar sistem Linux, ccadalah tautan simbolis ke gcc.
Renan

Senang mendengarnya. Meskipun menunjuk ke sesuatu yang lain pada sistem seperti Slaris, kan?
Linuxios

1
Baru saja memeriksa beberapa kotak Solaris, dan /usr/bin/cctautan ke /opt/SUNWspro/bin/ccsatu dan /opt/sunstudio12.1/bin/ccdi sisi lain. Apapun, itu masih kompiler C.
OrangeDog

1
Dan pada kotak HPUX itu /opt/ansic/bin/cc.
OrangeDog

23

Itu bukan program, itu kode sumber untuk suatu program.

C adalah bahasa yang dikompilasi , artinya harus "dikompilasi" ke dalam instruksi yang dapat dibaca mesin sebelum Anda dapat menjalankannya. Saat Anda menggunakan C, "C Compiler" ( cc) dapat melakukan ini.

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

Saat Anda beralih ke program yang lebih rumit, menggunakan beberapa file sumber dan pustaka eksternal, Anda kemungkinan akan beralih menggunakan "GNU Compiler Collection" ( gcc) dan makeuntuk menjelaskan cara mengubah kode sumber menjadi executable yang berfungsi.

Pertanyaan ini memiliki berbagai informasi tentang perbedaan antara skrip (karena Anda mencoba untuk memperlakukan kode sumber Anda) dan mengkompilasi program.


Jika "compiler" adalah bagian dari nama alat, saya akan menyebutnya cukup eksplisit.
OrangeDog

Hanya sebuah catatan bahwa alat yang saya beri nama bukan satu-satunya yang tersedia, tetapi kemungkinan akan tersedia secara default pada sistem GNU / Linux dan banyak digunakan.
OrangeDog

4
Mengenai kata "harus" itu, tcc( Tiny C Compiler ) dapat mengeksekusi kode C tanpa mengompilasinya secara eksplisit. pastebin.com/5FZiMpEn (komentar yang diedit dengan menambahkannya kembali. Maaf telah mengacaukan pesanan.)
manatwork
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.