【问题标题】:Why does my compiler not accept fork(), despite my inclusion of <unistd.h>?为什么我的编译器不接受 fork(),尽管我包含了 <unistd.h>?
【发布时间】:2012-03-25 14:53:34
【问题描述】:

这是我的代码(创建只是为了测试 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'

这有什么问题?

【问题讨论】:

  • 您是否安装了 C 库的头文件?你是如何调用你的编译器的?
  • gcc test.c -pedantic -Wall -o test.exe
  • 你确定 fork() 是 stdio.h 的一部分吗?它不是根据cplusplus.com/reference/clibrary/cstdio。可能与您包含的另一个头文件有冲突?
  • 显然它是 的一部分,它怎么会与我包含的内容冲突?
  • @user1166935:您使用的是什么操作系统?是否有可能由于某种原因您的 unistd.h 文件不好?

标签: c windows mingw fork


【解决方案1】:

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

pid_t pid = fork();

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

man fork

祝你好运!

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • OP 有&lt;unistd.h&gt; 可用;否则 gcc 会报告丢失的头文件的致命错误。
    • MinGW 没有实现 fork(),如果你真的需要 fork(),你可以试试 Cygwin(或真正的 POSIX 系统)。或者,您可以尝试类似的 windows 功能。
    • 虽然 Cygwin 确实实现了fork()it ain't pretty
    • “应该已经有关于如何获得工作环境的说明”——如果只有大学那么好的话。
    【解决方案3】:

    你有#include &lt;unistd.h&gt;,这是声明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,等等)。

    【讨论】:

    • 使用 gcc 和 glibc,功能测试宏 isn't actually requiredfork。包括unistd.h 就足够了。该标准确实规定应用程序应在包含标头之前定义_POSIX_C_SOURCE
    【解决方案4】:

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

    【讨论】:

    • fork 可在远不止“GNU/Linux”系统上使用——它可以在任何支持 POSIX 的地方使用,包括 GNU/Hurd、Unix、BSD 等。(为了记录,鉴于他的 cmets,我相信 OP 在 Windows 上)
    • (哦,忘了 Solaris 和 MacOSX,那里也有)
    • 实际上,我说的是“UNIX/Linux”,但是是的,fork() 是 POSIX 功能。仅仅因为您的主机操作系统提供 unistd.h,并不意味着它支持 POSIX 功能(这实际上是 unistd.h link 的要点)。该链接提供了一个线索。也许 OP 需要安装 Cygwin 以提供一些 POSIX/Windows 桥。或者只是使用不同的主机操作系统。
    猜你喜欢
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 2017-05-16
    • 1970-01-01
    相关资源
    最近更新 更多