尽管我包含了<unistd.h>?</unistd.h>,为什么我的编译器不接受fork()

时间:2012-03-08 02:56:58

标签: c windows mingw fork

这是我的代码(仅为测试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 个答案:

答案 0 :(得分:33)

unistd.hforkPOSIX standard的一部分。它们在Windows上不可用(在您的gcc命令中text.exe提示您没有使用* nix)。

看起来您正在使用gcc作为MinGW的一部分,它确实提供了unistd.h标头但未实现fork之类的功能。 Cygwin 提供fork等函数的实现。

然而,由于这是家庭作业,您应该已经掌握了如何获得工作环境的说明。

答案 1 :(得分:4)

您已#include <unistd.h>,即声明fork()的地方。

因此,在包含系统头文件之前,您可能需要告诉系统显示POSIX定义:

#define _XOPEN_SOURCE 600

如果您认为您的系统主要与POSIX 2008兼容,则可以使用700,对于较旧的系统,甚至可以使用500。因为fork()已经永远存在,所以它会出现在其中。

如果您正在使用-std=c99 --pedantic进行编译,那么除非您按所示明确请求,否则将隐藏POSIX的所有声明。

您也可以使用_POSIX_C_SOURCE,但使用_XOPEN_SOURCE表示正确对应_POSIX_C_SOURCE(和_POSIX_SOURCE,等等)。

答案 2 :(得分:2)

正如您已经注意到的,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库中定义,它就不会是一个大问题。只需在兼容性标题中定义您自己的原型,并向维护您的操作系统分发的人报告标准标题问题。

答案 3 :(得分:0)

我认为您必须执行以下操作:

pid_t pid = fork();

要了解有关Linux API的更多信息,请转到this online manual page,或者立即进入您的终端并输入

man fork
祝你好运!