这里是我的代码(创建只是为了测试叉()):
#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'
有什么不对呢?
unistd.h
和fork
是的一部分POSIX标准 。 他们并不适用于Windows( text.exe
在海湾合作委员会的命令提示那你不是在* nix)。
它看起来像你使用gcc作为的一部分MinGW的 ,这的确提供了unistd.h
头,但不执行类似功能的fork
。 Cygwin的 确实提供的类似功能的实现fork
。
然而,由于这是功课,你应该已经对如何获得工作环境的说明。
你已经得到#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
,等等)。
正如你已经注意到,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
祝好运!