为什么我不能运行这个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”;在“情况-1:”行上。稍后,您将为自己感谢。另外,让子进程调用_exit(0),并让父进程调用exit(0)。
布鲁斯·埃迪格

4
@BruceEdiger为什么需要_exit?进行已注册的任何清理有什么问题?
OrangeDog 2012年

4
exit(0)将刷新stdout和stderr。_exit(0)不会。如果程序执行fork()且子代调用exit(0)时,stdout上有一些字节,则可以得到双倍输出。因为您正在学习fork()的工作原理,为什么要迷惑自己?
布鲁斯·埃迪格

@BruceEdiger学习如何fork()工作包括学习它可以复制缓冲的输出。作为一个相当复杂的系统调用,在学习过程中可能会有些混乱。
OrangeDog 2012年

Answers:


67

你不能只跑./fork.c。这不是程序;它是程序的源代码。使用./假定该文件是脚本(不是),并相应地对其进行处理。

但是,正如另一个答案所述,有些编译器(例如Tiny C Compiler)可以执行C代码而无需显式编译它。

由于它是C程序,因此您必须编译该程序。cc -o fork fork.c然后尝试./fork; 它在这里工作。


如果您使用的是Linux,则可能是GCC,而不是CC。
Linuxios 2012年

6
在大多数Linux系统中,@ Linuxios cc是指向的符号链接gcc
雷南2012年

很高兴知道。尽管它指向Slaris等系统上的其他内容,对吗?
Linuxios 2012年

1
刚刚选中了两个Solaris框,并在另一个上/usr/bin/cc指向。无论如何,它仍然是C编译器。/opt/SUNWspro/bin/cc/opt/sunstudio12.1/bin/cc
OrangeDog 2012年

1
在HPUX盒子上是/opt/ansic/bin/cc
OrangeDog 2012年

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编译器集合”(gcc),并make描述如何将源代码转换为可运行的可执行文件。

这个问题提供了有关脚本(在尝试处理源代码时)和已编译程序之间的区别的各种信息。


如果“编译器”是该工具名称的一部分,那么我将其称为显式的。
OrangeDog 2012年

请注意,我命名的工具不是唯一可用的工具,但是在默认情况下很可能在GNU / Linux系统上可用,并且被广泛使用。
OrangeDog 2012年

4
关于“必须”一词,tccTiny C Compiler)可以执行C代码而无需显式编译它。pastebin.com/5FZiMpEn(通过重新添加注释进行编辑。很抱歉使订单混乱。)
manatwork 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.