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

这是我的代码(创build只是为了testingfork()):

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

它有什么问题?

Solutions Collecting From Web of "为什么我的编译器不接受fork(),尽pipe包含了<unistd.h>?"

unistd.hfork是POSIX标准的一部分。 它们不能在Windows上使用(你的gcc命令中的text.exe暗示你不在* nix上)。

看起来你使用gcc作为MinGW的一部分,它提供了unistd.h头文件,但是并没有实现像fork这样的函数。 Cygwin 确实提供了像fork这样的函数的实现。

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

你有#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 ,等等)。

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

我认为你必须做下面的事情:

 pid_t pid = fork(); 

要了解有关Linux API的更多信息,请转至此在线手册页面 ,或者直接进入您的终端并键入,

 man fork 

祝你好运!