Tại sao tôi không thể chạy chương trình C này?


12

Tôi đang cố chạy chương trình "quy trình" đầu tiên của mình, nhưng tôi gặp phải lỗi sau:

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

Tôi khá chắc chắn rằng mã là chính xác:

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

Chuyện gì thế?


15
Chỉ vì lợi ích của sự tỉnh táo của bạn sau này, hãy đặt "nghỉ ngơi"; trên dòng "trường hợp -1:". Bạn sẽ cảm ơn bạn cho nó sau. Ngoài ra, yêu cầu tiến trình con gọi _exit (0) và thoát lệnh gọi cha (0).
Bruce Ediger

4
@BruceEdiger Tại sao cần _exit? Có gì sai khi thực hiện bất kỳ việc dọn dẹp nào đã được đăng ký?
OrangeDog

4
exit (0) sẽ xóa stdout và stderr. _exit (0) sẽ không. Bạn có thể kết thúc với đầu ra kép nếu có một số byte trên thiết bị xuất chuẩn khi chương trình của bạn thực hiện fork () và con gọi exit (0). Bởi vì bạn đang học cách fork () hoạt động tại sao lại nhầm lẫn chính mình?
Bruce Ediger

@BruceEdiger học cách làm fork()việc bao gồm học cách nó có thể sao chép đầu ra được đệm. Là một cuộc gọi hệ thống khá phức tạp, một số nhầm lẫn có lẽ là cần thiết trong quá trình học tập.
OrangeDog

Câu trả lời:


67

Bạn không thể chạy ./fork.c. Đây không phải là một chương trình; đó là nguồn cho một chương trình. Sử dụng ./giả định rằng tệp là một tập lệnh (không có) và xử lý nó cho phù hợp.

Tuy nhiên, như đã lưu ý trong một câu trả lời khác, có các trình biên dịch (như Trình biên dịch Tiny C ) có thể thực thi mã C mà không cần biên dịch rõ ràng.

Vì là chương trình C, bạn phải biên dịch chương trình. Hãy thử cc -o fork fork.csau đó ./fork; nó đã làm việc ở đây


Và nếu bạn dùng Linux, có lẽ là GCC, không phải CC.
Linuxios

6
@Linuxios trong hầu hết các hệ thống Linux, cclà một liên kết tượng trưng đến gcc.
Renan

Tốt để biết. Mặc dù nó chỉ ra một cái gì đó khác trên các hệ thống như Slaris, phải không?
Linuxios

1
Chỉ cần kiểm tra một vài hộp Solaris và /usr/bin/ccliên kết đến /opt/SUNWspro/bin/cccái này và /opt/sunstudio12.1/bin/cccái kia. Bất kể, nó vẫn là một trình biên dịch C.
OrangeDog

1
Và trên hộp HPUX /opt/ansic/bin/cc.
OrangeDog

23

Đó không phải là một chương trình, đó là mã nguồn của một chương trình.

C là một ngôn ngữ được biên dịch , có nghĩa là nó phải được "biên dịch" thành các hướng dẫn dễ đọc bằng máy trước khi bạn có thể chạy nó. Khi bạn đang sử dụng C, "Trình biên dịch C" ( cc) có thể thực hiện việc này.

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

Khi bạn chuyển sang các chương trình phức tạp hơn, sử dụng nhiều tệp nguồn và thư viện bên ngoài, bạn có thể sẽ chuyển sang sử dụng "Bộ sưu tập trình biên dịch GNU" ( gcc) và makeđể mô tả cách biến mã nguồn thành mã thực thi hoạt động.

Câu hỏi này có nhiều thông tin khác nhau về sự khác biệt giữa các tập lệnh (khi bạn đang cố xử lý mã nguồn của mình) và các chương trình được biên dịch.


Nếu "trình biên dịch" là một phần của tên của công cụ, tôi sẽ gọi nó là rõ ràng hợp lý.
OrangeDog

Chỉ cần lưu ý rằng các công cụ tôi đặt tên không phải là những công cụ duy nhất có sẵn, nhưng có khả năng sẽ có sẵn theo mặc định trên hệ thống GNU / Linux và được sử dụng rộng rãi.
OrangeDog

4
Về từ "phải", tcc( Trình biên dịch Tiny C ) có thể thực thi mã C mà không cần biên dịch rõ ràng. pastebin.com/5FZiMpEn (Đã chỉnh sửa nhận xét bằng cách thêm lại. Xin lỗi vì đã làm rối trật tự.)
manatwork
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.