为什么我的编译器不接受fork()的,尽管我的包容 ? 为什么我的编译器不接受fork()的,

2019-05-12 04:51发布

这里是我的代码(创建只是为了测试叉()):

#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'

有什么不对呢?

Answer 1:

unistd.hfork是的一部分POSIX标准 。 他们并不适用于Windows( text.exe在海湾合作委员会的命令提示那你不是在* nix)。

它看起来像你使用gcc作为的一部分MinGW的 ,这的确提供了unistd.h头,但不执行类似功能的fork 。 Cygwin的 确实提供的类似功能的实现fork

然而,由于这是功课,你应该已经对如何获得工作环境的说明。



Answer 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 ,等等)。



Answer 3:

正如你已经注意到,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库正在定义它不会是一个巨大的问题。 只是在兼容性标题定义自己的原型和报告标准头问题,负责维护您的操作系统分布。



Answer 4:

我认为你需要做的,而不是执行以下操作:

pid_t pid = fork();

要了解更多关于Linux API,去这个在线手册页 ,甚至进入你的终端,现在和类型,

man fork

祝好运!



文章来源: Why does my compiler not accept fork(), despite my inclusion of ?