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并且fork是POSIX标准的一部分.它们在Windows上不可用(text.exe在您的gcc命令提示中,您不在*nix上).
看起来你正在使用gcc作为MinGW的一部分,它确实提供了unistd.h标题,但没有实现像fork.Cygwin 确实提供了类似函数的实现fork.
但是,由于这是家庭作业,您应该已经掌握了如何获得工作环境的说明.
你有#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 库中定义,就不会是一个大问题。只需在兼容性标头中定义您自己的原型,并将标准标头问题报告给维护您的操作系统发行版的人员即可。