Чому я не можу запустити цю програму 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
Просто задля власного розуму пізніше поставте «перерву»; у рядку "випадок -1:". Ви подякуєте за це пізніше. Також запросіть дочірній процес виклику _exit (0) та вихідного виклику (0).
Брюс Едігер

4
@BruceEdiger Чому потрібно _exit? Що поганого в тому, щоб зробити будь-яку очистку, яка була зареєстрована?
OrangeDog

4
вихід (0) змине stdout та stderr. _exit (0) не буде. Ви можете отримати подвійні виходи, якщо на stdout є кілька байтів, коли ваша програма виконує форк (), а дочірній виклик виходить (0). Тому що ви вчитеся, як працює fork (), чому плутати себе?
Брюс Едігер

@BruceEdiger, як fork()працює, включає вивчення, що воно може скопіювати буферний вихід. Будучи досить складним системним викликом, певна плутанина, ймовірно, необхідна в процесі навчання.
OrangeDog

Відповіді:


67

Ви не можете просто бігти ./fork.c. Це не програма; це джерело для програми. Використання ./передбачає, що файл є сценарієм (який він не є) і обробляє його відповідно.

Однак, як зазначається в іншій відповіді, є компілятори (наприклад, Tiny C Compiler ), які можуть виконувати 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інший. Незалежно, це все ще компілятор C.
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

Лише зауважте, що інструменти, які я назвав, - не єдині з наявних, але, ймовірно, будуть доступні за замовчуванням у системі GNU / Linux і широко використовуються.
OrangeDog

4
Щодо того, що "must" слово tcc( Tiny C Compiler ) може виконувати код C без явного його складання. pastebin.com/5FZiMpEn (Відредагований коментар, повторно додавши його. Вибачте за те, що ви
порушили
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.