ทำไมฉันไม่สามารถรันโปรแกรม C นี้ได้?


12

ฉันพยายามเรียกใช้โปรแกรม "กระบวนการ" ครั้งแรกของฉัน แต่ฉันได้รับข้อผิดพลาดต่อไปนี้:

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

ฉันค่อนข้างมั่นใจว่ารหัสถูกต้อง:

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

เกิดอะไรขึ้น?


15
เพียงเพื่อประโยชน์ของความมีสติของคุณเองในภายหลังให้วาง "break;" บนบรรทัด "case -1:" คุณจะขอบคุณตัวเองในภายหลัง นอกจากนี้ยังมีการเรียกกระบวนการเด็ก _exit (0) และผู้ปกครองโทรออก (0)
Bruce Ediger

4
@BruceEdiger ทำไมต้องมี_exit? เกิดอะไรขึ้นกับการล้างข้อมูลที่ลงทะเบียนแล้ว
OrangeDog

4
exit (0) จะล้างข้อมูล stdout และ stderr _exit (0) จะไม่ คุณสามารถจบลงด้วยผลลัพธ์สองเท่าหากมีบางไบต์ใน stdout เมื่อโปรแกรมของคุณทำการ fork () และ child call exit (0) เพราะคุณกำลังเรียนรู้วิธีแยก () ทำงานทำไมต้องทำให้ตัวเองสับสน?
Bruce Ediger

@BruceEdiger การเรียนรู้วิธีการfork()ทำงานรวมถึงการเรียนรู้ว่ามันสามารถคัดลอกเอาท์พุทบัฟเฟอร์ การมีระบบที่ซับซ้อนพอสมควรอาจทำให้เกิดความสับสนในกระบวนการเรียนรู้
OrangeDog

คำตอบ:


67

คุณไม่สามารถวิ่ง./fork.cได้ มันไม่ใช่โปรแกรม มันเป็นแหล่งสำหรับโปรแกรม การใช้./จะถือว่าไฟล์เป็นสคริปต์ (ซึ่งไม่ใช่) และปฏิบัติตาม

อย่างไรก็ตามตามที่ระบุไว้ในคำตอบอื่นมีคอมไพเลอร์ (เช่นTiny C Compiler ) ที่สามารถรันโค้ด C ได้โดยไม่ต้องคอมไพล์อย่างชัดเจน

เนื่องจากเป็นโปรแกรม C คุณต้องรวบรวมโปรแกรม ลองcc -o fork fork.cแล้ว./fork; มันทำงานที่นี่


และหากคุณใช้งานบน Linux ก็อาจเป็น GCC ไม่ใช่ CC
Linuxios

6
@Linuxios ในระบบลินุกซ์มากที่สุดคือการเชื่อมโยงสัญลักษณ์cc gcc
Renan

ดีแล้วที่รู้. แม้ว่ามันจะชี้ไปที่สิ่งอื่นในระบบเช่น Slaris ใช่ไหม
Linuxios

1
ตรวจสอบเพียงคู่ของกล่อง Solaris และ/usr/bin/ccเชื่อมโยงไปยัง/opt/SUNWspro/bin/ccที่หนึ่งและ/opt/sunstudio12.1/bin/ccที่อื่น ๆ ไม่ว่ามันจะเป็นคอมไพเลอร์ C ก็ตาม
OrangeDog

1
และในกล่อง HPUX /opt/ansic/bin/ccมัน
OrangeDog

23

นี่ไม่ใช่โปรแกรมนั่นคือซอร์สโค้ดของโปรแกรม

C เป็นภาษาที่คอมไพล์ซึ่งหมายความว่าต้อง "คอมไพล์" เป็นคำสั่งที่เครื่องอ่านได้ก่อนที่คุณจะสามารถรันได้ ในขณะที่คุณใช้งาน C "คอมไพเลอร์ C" ( cc) สามารถทำได้

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

ในขณะที่คุณย้ายไปยังโปรแกรมที่ซับซ้อนมากขึ้นโดยใช้ไฟล์หลายแหล่งและไลบรารีภายนอกคุณอาจย้ายไปใช้ "GNU Compiler Collection" ( gcc) และmakeเพื่ออธิบายวิธีเปลี่ยนซอร์สโค้ดให้เป็นไฟล์เรียกทำงานที่ใช้งานได้

คำถามนี้มีข้อมูลต่าง ๆ เกี่ยวกับความแตกต่างระหว่างสคริปต์ (ในขณะที่คุณพยายามรักษาซอร์สโค้ดของคุณ) และโปรแกรมที่คอมไพล์


หาก "คอมไพเลอร์" เป็นส่วนหนึ่งของชื่อของเครื่องมือฉันจะเรียกมันอย่างชัดเจน
OrangeDog

เพิ่งทราบว่าเครื่องมือที่ฉันตั้งชื่อไม่ใช่เครื่องมือที่มีอยู่ แต่มีแนวโน้มว่าจะพร้อมใช้งานตามค่าเริ่มต้นในระบบ GNU / Linux และใช้กันอย่างแพร่หลาย
OrangeDog

4
เกี่ยวกับคำว่า "ต้อง" tcc( Tiny C Compiler ) สามารถรันโค้ด C ได้โดยไม่ต้องรวบรวมอย่างชัดเจน pastebin.com/5FZiMpEn (แก้ไขความคิดเห็นโดยเพิ่มอีกครั้งขออภัยในการเรียงลำดับ)
จัดการ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.