Почему мой компилятор не принимает fork (), несмотря на мое включение <unistd.h>? - PullRequest
13 голосов
/ 08 марта 2012

Вот мой код (созданный только для тестирования fork ()):

#include <stdio.h>  
#include <ctype.h>
#include <limits.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h> 

int main()
{   
    int pid;     
    pid=fork();

    if (pid==0) {
        printf("I am the child\n");
        printf("my pid=%d\n", getpid());
    }

    return 0;
}

Я получаю следующие предупреждения:

warning: implicit declaration of function 'fork'
undefined reference to 'fork'

Что с ним не так?

Ответы [ 4 ]

33 голосов
/ 08 марта 2012

unistd.h и fork являются частью стандарта POSIX .Они недоступны в Windows (text.exe в подсказках вашей команды gcc, что вы не в * nix).

Похоже, вы используете gcc как часть MinGW , который предоставляет заголовок unistd.h, но не реализует такие функции, как fork. Cygwin обеспечивает реализацию таких функций, как fork.

Однако, поскольку это домашнее задание, у вас уже должны быть инструкции о том, как получить рабочую среду.

4 голосов
/ 08 марта 2012

У вас есть #include <unistd.h>, где fork() объявлено.

Итак, вам, вероятно, нужно указать системе показывать определения POSIX, прежде чем включать системные заголовки:

#define _XOPEN_SOURCE 600

Вы можете использовать 700, если считаете, что ваша система в основном совместима с POSIX 2008, или даже 500 для более старой системы.Поскольку fork() существует всегда, он будет отображаться с любым из них.

Если вы компилируете с -std=c99 --pedantic, то все объявления для POSIX будут скрыты, если вы явно не запросите их, как показано.

Вы также можете играть с _POSIX_C_SOURCE, но использование _XOPEN_SOURCE подразумевает правильный соответствующий _POSIX_C_SOURCE_POSIX_SOURCE и т. Д.).

2 голосов
/ 08 марта 2012

Как вы уже заметили, fork () должен быть определен в unistd.h - по крайней мере, в соответствии со справочными страницами, которые поставляются с Ubuntu 11.10.Минимальный:

#include <unistd.h>

int main( int argc, char* argv[])
{
    pid_t procID;

    procID = fork();
    return procID;
}

... собирается без предупреждений 11.10.

Кстати, какой дистрибутив UNIX / Linux вы используете?Например, я обнаружил несколько не примечательных функций, которые должны быть определены в заголовках Ubuntu 11.10.Например:

// string.h
char* strtok_r( char* str, const char* delim, char** saveptr);
char* strdup( const char* const qString);

// stdio.h
int fileno( FILE* stream);

// time.h
int nanosleep( const struct timespec* req, struct timespec* rem);

// unistd.h
int getopt( int argc, char* const argv[], const char* optstring);
extern int opterr;
int usleep( unsigned int usec);

Пока они определены в вашей библиотеке C, это не будет большой проблемой.Просто определите свои собственные прототипы в заголовке совместимости и сообщите о проблемах стандартного заголовка тому, кто поддерживает дистрибутив вашей ОС.

0 голосов
/ 02 февраля 2016

Я думаю, что вместо этого вы должны сделать следующее:

pid_t pid = fork();

Чтобы узнать больше о Linux API, перейдите на эту страницу онлайнового руководства или даже зайдите в свой терминал прямосейчас и набери,

man fork

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...