Bu C programını neden çalıştıramıyorum?


12

İlk "süreç" programını çalıştırmaya çalışıyorum, ancak aşağıdaki hatayı alıyorum:

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

Kodun doğru olduğundan eminim:

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

Yanlış olan ne?


15
Sadece daha sonra kendi akıl sağlığınız için bir "ara verin"; "case -1:" satırında. Daha sonra bunun için kendinize teşekkür edeceksiniz. Ayrıca, alt işlem çağrısı _exit (0) ve üst çağrıdan çık (0).
Bruce Ediger

4
@BruceEdiger Neden ihtiyaç var _exit? Kayıtlı herhangi bir temizlik yapmanın nesi yanlış?
OrangeDog

4
çıkış (0) stdout ve stderr'i temizler. _exit (0) olmayacak. Programınız çatalı () yaptığında ve çıkış (0) çağrısı yaptığında stdout'ta bazı baytlar varsa, çift çıkışla sonuçlanabilir. Çatal () 'nın nasıl çalıştığını öğrendiğiniz için neden kendinizi şaşırtmalısınız?
Bruce Ediger

@BruceEdiger nasıl fork()çalıştığını öğrenmek, arabelleğe alınmış çıktıyı kopyalayabileceğini öğrenmek içerir. Oldukça karmaşık bir sistem çağrısı olarak, öğrenme sürecinde muhtemelen bazı karışıklıklar gereklidir.
OrangeDog

Yanıtlar:


67

Sadece kaçamazsın ./fork.c. Bu bir program değil; öyle kaynak bir program için. Kullanarak ./dosyanın bir komut dosyası olduğunu varsayar (ki bu da değildir) ve buna göre davranır.

Bununla birlikte, başka bir cevapta belirtildiği gibi , C kodunu açıkça derlemeden çalıştırabilen derleyiciler ( Tiny C Derleyici gibi ) vardır.

Bir C programı olduğu için programı derlemelisiniz. cc -o fork fork.cO zaman deneyin ./fork; burada çalıştı.


Ve eğer Linux'taysanız, muhtemelen CC değil, GCC'dir.
Linuxios

6
@Linuxios çoğu Linux sisteminde, ccsimgesel bir bağlantıdır gcc.
Renan

Bunu bildiğim iyi oldu. Slaris gibi sistemlerde başka bir şeye işaret etse de, değil mi?
Linuxios

1
Sadece birkaç Solaris kutusunu kontrol ettiniz ve bir diğerine /usr/bin/ccbağlantılar . Ne olursa olsun, hala bir C derleyicisi. /opt/SUNWspro/bin/cc/opt/sunstudio12.1/bin/cc
OrangeDog

1
Ve bir HPUX kutusunda /opt/ansic/bin/cc.
OrangeDog

23

Bu bir program değil, bir programın kaynak kodu.

C derlenmiş bir dildir, yani çalıştırmadan önce makine tarafından okunabilir talimatlara "derlenmelidir". C kullandığınız gibi, "C Derleyici" ( cc) bunu yapabilirsiniz.

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

Birden fazla kaynak dosyası ve harici kitaplık kullanarak daha karmaşık programlara geçtiğinizde, büyük olasılıkla "GNU Derleyici Koleksiyonu" ( gcc) kullanmaya ve makekaynak kodunun çalışan bir yürütülebilir dosyaya nasıl dönüştürüleceğini açıklamaya başlayacaksınız .

Bu sorunun komut dosyaları (kaynak kodunuzu tedavi etmeye çalışırken) ve derlenmiş programlar arasındaki fark hakkında çeşitli bilgileri vardır.


Eğer "derleyici" aracının isminin bir parçasıysa, bunu oldukça açık olarak adlandırırım.
OrangeDog

Sadece adlandırdığım araçların mevcut olan tek araç olmadığını, ancak GNU / Linux sisteminde varsayılan olarak kullanılabileceğini ve yaygın olarak kullanıldığını unutmayın.
OrangeDog

4
Bu "zorunluluk" kelimesi ile ilgili olarak, tcc( Tiny C Compiler ) açıkça derlemeden C kodunu yürütebilir. pastebin.com/5FZiMpEn (Yorumu tekrar ekleyerek düzenlenmiştir. Siparişi
bozduğum
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.