Почему я не могу запустить эту программу на 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
Просто ради вашего собственного здравомыслия позже поставьте «перерыв»; в строке "case -1:". Вы будете благодарны за это позже. Кроме того, вызовите дочерний процесс _exit (0) и вызовите родительский вызов exit (0).
Брюс Эдигер
4
@BruceEdiger Зачем это нужно _exit? Что плохого в выполнении очистки, которая была зарегистрирована?
OrangeDog
4
выход (0) будет сбрасывать стандартный вывод и стандартный вывод. _exit (0) не будет. Вы можете получить двойной выход, если в stdout есть несколько байтов, когда ваша программа выполняет fork (), а потомок вызывает exit (0). Поскольку вы изучаете, как работает fork (), зачем путать себя?
Брюс Эдигер
Обучение @BruceEdiger принципам fork()работы включает в себя изучение того, что он может копировать буферизованный вывод. Будучи достаточно сложным системным вызовом, некоторая путаница, вероятно, необходима в процессе обучения.
OrangeDog

Ответы:

67

Ты не можешь просто бежать ./fork.c. Это не программа; это источник для программы. Использование ./предполагает, что файл является сценарием (а это не так) и обрабатывает его соответствующим образом.

Однако, как отмечено в другом ответе, существуют компиляторы (например, Tiny C Compiler ), которые могут выполнять код на C без явной его компиляции.

Так как это программа на C, вы должны скомпилировать программу. Попробуй cc -o fork fork.cтогда ./fork; это сработало здесь.

Ренан
источник
И если вы используете Linux, это, вероятно, GCC, а не CC.
Linuxios
6
@Linuxios в большинстве систем Linux ccявляется символической ссылкой на gcc.
Ренан
Хорошо знать. Хотя это указывает на что-то еще в таких системах, как Slaris, верно?
Linuxios
1
Только что проверил пару ящиков Solaris и /usr/bin/ccссылки /opt/SUNWspro/bin/ccна одну и /opt/sunstudio12.1/bin/ccдругую. Несмотря на это, это все еще компилятор Си.
OrangeDog
1
И на коробке HPUX это /opt/ansic/bin/cc.
OrangeDog
23

Это не программа, это исходный код программы.

C - это скомпилированный язык, то есть он должен быть «скомпилирован» в машиночитаемые инструкции, прежде чем вы сможете его запустить. Поскольку вы используете C, «C Compiler» ( 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
источник
Если «компилятор» является частью названия инструмента, я бы назвал это достаточно явным.
OrangeDog
Просто обратите внимание, что инструменты, которые я назвал, не единственные доступные, но, вероятно, будут доступны по умолчанию в системе GNU / Linux и широко используются.
OrangeDog
4
Что касается слова "must", tcc( Tiny C Compiler ) может выполнять код на C без явной его компиляции. pastebin.com/5FZiMpEn (отредактированный комментарий, добавив его заново. Извините, что
испортил