これが私のコードです(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'
それの何が問題になっていますか?
fork()
が宣言されている_#include <unistd.h>
_を取得しました。
したがって、システムヘッダーを含める前に、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に付属のmanページによると。最小限:
#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ライブラリで定義されている限り、大きな問題にはなりません。互換性ヘッダーで独自のプロトタイプを定義し、OSディストリビューションを管理している人に標準ヘッダーの問題を報告するだけです。
代わりに次のことを行う必要があると思います。
pid_t pid = fork();
Linux APIの詳細については、 このオンラインマニュアルページ にアクセスするか、ターミナルに移動して次のように入力してください。
man fork
幸運を!