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

Здесь мой код (созданный только для проверки 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'

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

Ответ 1

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

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

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

Ответ 2

У вас есть #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 и т.д.).

Ответ 3

Как вы уже отметили, fork() следует определить в unistd.h - по крайней мере, согласно страницам man, которые поставляются с 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, это не будет большой проблемой. Просто определите свои собственные прототипы в заголовке совместимости и сообщите о стандартных проблемах с заголовками тем, кто поддерживает ваш дистрибутив ОС.

Ответ 4

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

pid_t pid = fork();

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

man fork

Удачи!