apueにおけるvfork()関数のコンパイルエラー解決
vfork()のサンプルコードをコンパイルすると、常に次のようにエラーが発生します.
vfork()関数は/usr/include/unistdで宣言されていることがわかります.hファイルには、サンプルコードにもヘッダファイルが含まれていますが、コンパイル時にvfork()関数が宣言されていません.unistdを表示します.hのコードは、vfork()の宣言コードが条件コンパイル命令に存在することを発見し、以下のようにする.
私のシステムはUbuntu 16.04で、このシステムの下でこの条件のコンパイルは通過しないようで、そのためincludeのこのヘッダファイルでも役に立ちません.この条件をコンパイルして削除し、直接:
そしてunistd.h/usr/local/include/パスにコピーし(コピーしないでコンパイルエラー、このパスと/usr/includeがCプログラムコンパイル時<>ヘッダファイル検索のデフォルトパス)、さらに前のサンプルコードをコンパイルし、コンパイルします.
ex_8_2.c: In function ‘math’:
ex_8_2.c:22:12: warning: implicit declaration of function ‘vfork’ [-Wimplicit-function-declaration]
if((pid = vfork()) < 0)
^
vfork()関数は/usr/include/unistdで宣言されていることがわかります.hファイルには、サンプルコードにもヘッダファイルが含まれていますが、コンパイル時にvfork()関数が宣言されていません.unistdを表示します.hのコードは、vfork()の宣言コードが条件コンパイル命令に存在することを発見し、以下のようにする.
#if (defined __USE_XOPEN_EXTENDED && !defined __USE_XOPEN2K8) \
|| defined __USE_MISC
extern __pid_t vfork (void) __THROW;
#endif /* Use misc or XPG < 7. */
私のシステムはUbuntu 16.04で、このシステムの下でこの条件のコンパイルは通過しないようで、そのためincludeのこのヘッダファイルでも役に立ちません.この条件をコンパイルして削除し、直接:
extern __pid_t vfork (void) __THROW;
そしてunistd.h/usr/local/include/パスにコピーし(コピーしないでコンパイルエラー、このパスと/usr/includeがCプログラムコンパイル時<>ヘッダファイル検索のデフォルトパス)、さらに前のサンプルコードをコンパイルし、コンパイルします.