Почему мой компилятор не принимает 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
Удачи!