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.