这是我的代码(仅为测试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'
它出了什么问题?
答案 0 :(得分:33)
unistd.h
和fork
是POSIX 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
祝你好运!