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

Sus*_*ded 14 c windows fork mingw

这是我的代码(仅为测试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;
}
Run Code Online (Sandbox Code Playgroud)

我收到以下警告:

warning: implicit declaration of function 'fork'
undefined reference to 'fork'
Run Code Online (Sandbox Code Playgroud)

这有什么问题?

str*_*cat 35

unistd.h并且forkPOSIX标准的一部分.它们在Windows上不可用(text.exe在您的gcc命令提示中,您不在*nix上).

看起来你正在使用gcc作为MinGW的一部分,它确实提供了unistd.h标题,但没有实现像fork.Cygwin 确实提供了类似函数的实现fork.

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

  • 虽然Cygwin确实实现了`fork()`,[它并不漂亮](http://cygwin.com/cygwin-ug-net/highlights.html#ov-hi-process). (4认同)
  • OP有"<unistd.h>"可用; 否则gcc会报告丢失的头文件的致命错误. (2认同)
  • MinGW没有实现fork(),如果你真的需要fork(),你可以试试Cygwin(或真正的POSIX系统).或者,您可以尝试类似的Windows功能. (2认同)

Jon*_*ler 7

你有#include <unistd.h>这就是fork()声明。

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

#define _XOPEN_SOURCE 600
Run Code Online (Sandbox Code Playgroud)

如果您认为您的系统主要符合 POSIX 2008 标准,则可以使用 700,对于较旧的系统,甚至可以使用 500。因为fork()它已经永远存在了,它会与其中任何一个一起出现。

如果您使用 进行编译-std=c99 --pedantic,则除非您明确要求它们,否则所有 POSIX 声明都将被隐藏,如图所示。

您也可以使用_POSIX_C_SOURCE,但使用_XOPEN_SOURCE意味着正确的对应_POSIX_C_SOURCE(和_POSIX_SOURCE,等等)。


小智 6

正如您已经注意到的,fork() 应该在 unistd.h 中定义 - 至少根据 Ubuntu 11.10 附带的手册页。最小的:

#include <unistd.h>

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

    procID = fork();
    return procID;
}
Run Code Online (Sandbox Code Playgroud)

...在 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);
Run Code Online (Sandbox Code Playgroud)

只要它们在您的 C 库中定义,就不会是一个大问题。只需在兼容性标头中定义您自己的原型,并将标准标头问题报告给维护您的操作系统发行版的人员即可。

  • `fork` 不仅仅可以在“GNU/Linux”系统上使用——它可以在任何支持 POSIX 的地方使用,其中包括 GNU/Hurd、Unix、BSD 等。(根据记录,我相信 OP 是在 Windows 上的)他的评论) (3认同)