web-dev-qa-db-ja.com

<unistd.h>をインクルードしても、コンパイラーがfork()を受け入れないのはなぜですか?

これが私のコードです(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'

それの何が問題になっていますか?

15
Suspended

unistd.hおよびforkPOSIX標準 の一部です。これらはWindowsでは使用できません(gccコマンドのtext.exeは、* nixを使用していないことを示唆しています)。

MinGW の一部としてgccを使用しているようです。これは、unistd.hヘッダーを提供しますが、forkのような関数を実装していません。 Cygwindoesは、forkのような関数の実装を提供します。

ただし、これは宿題なので、作業環境を取得する方法についての説明はすでにあるはずです。

33
strcat

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_など)が暗黙的に使用されます。

4

すでに述べたように、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ディストリビューションを管理している人に標準ヘッダーの問題を報告するだけです。

2
Craig Mc

代わりに次のことを行う必要があると思います。

pid_t pid = fork();

Linux APIの詳細については、 このオンラインマニュアルページ にアクセスするか、ターミナルに移動して次のように入力してください。

man fork

幸運を!

0
2fewChars