プロが教えるわが家の防犯対策術!

C言語 fork()について

C言語でSystem Call fork()というものがあるそうで、まずは
http://cai.int-univ.com/sugsi/Lecture/NetProg/ch …

こちらのサイトの例をvisual studio 2008で実行させてみようと思ったのですが、以下のエラーが表示されてしまいました。

1>c:\users\user\documents\visual studio 2008\projects\project1\system call fork\system call fork\system call fork.cpp(3) : fatal error C1083: include ファイルを開けません。'unistd.h': No such file or directory

ソースは以下のものです。

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main(void)
{
int pid;
char msg[256];

sprintf(msg, "hello world");//sprinf()でmsgにhello worldを格納する
pid = fork();
if(pid == 0)
printf("%s, child process\n", msg);
else
printf("%s, parent process\n", msg);

return 0;
}
#include <unistd.h>について注意されていますが、これは何なのでしょうか?
#include<stdio.h>ならprintf()などの基本的な関数を使うのに必要なものと覚えたので、
#include <unistd.h>もfork()を使うときに必要なものだろう程度に思っているのですが、どうすれば、まずこのプログラムが実行できるんでしょうか?

No such file or directoryと書かれているぐらいですから、下準備としてこのプロジェクトが保存されている場所でtxtファイルか何かを準備しておく必要があるということですかね...

A 回答 (3件)

>#include <unistd.h>もfork()を使うときに必要なものだろう程度に思っているのですが、どうすれば、まずこのプログラムが実行できるんでしょうか?



認識は合っています。
が……

>こちらのサイトの例をvisual studio 2008で実行させてみようと

Windows環境にfork()システムコールはありません。
cygwinインストールして、gccでやれば……システムコールではありませんが
動作するかも知れませんが。
# 未検証です。

C言語でも、「環境依存」はする。
というコトです。
    • good
    • 0

unistd.hは、Unix Standardの略でUnixの標準的なシステムコールを集めたヘッダファイルです。

UnixあるいはUnix互換のOSでしか使えません。WindowsはUnixではないので何処を探してもunistd.hなんてヘッダファイルはないと思います。どうしてもこれを使いたい場合は、UnixあるいはUnixもどきのOS (FreeBSDやLinuxなど) をインストールした計算機を用意するか、WindowsでUnixもどきの環境を使うためのソフトウェア集であるcygwinを使うかする必要があるでしょう。(この場合、Visual Studioに付いてくるコンパイラは使えませんが)

ちなみに、Windowsでプロセスを作りたい場合はCreateProcessというAPIを使います。http://msdn.microsoft.com/ja-jp/library/cc429066 …
こいつを使うと新しいプロセスを作ることはできますが、新しく作られたプログラムの先頭から実行するのでfork()というより、fork()後にexecを実行したのと同等の動作になりますけどね。

さらに余談ですが、WindowsとUnixでほぼ似た様なコードを書きつつ並列処理をさせる場合はスレッドを使います。スレッドを作るのはWindowsだと_beginthreadexで、Unixだとpthread_createと関数名も引数も全く違いますが、ここを#ifdefで切り替えて、ハンドルとpthread_t型変数の取り扱いさえ#defineなどで誤魔化せばうまく動きますからね。(昔、バイトでWindows XPとFreeBSDで動くスレッドプールライブラリを作ったことがあります)

というわけで、Windowsなのでfork()は使えませんし、unistd.hなんてヘッダファイルもありませんが、あしからず。でも、スレッドだったらかなりいい線いったコードが書けます。
    • good
    • 0

#includeはコンパイル時に、そのファイルをその場所にあるかのように取り込んでくるだけなので、指定のファイルパスにそのヘッダーファイルが必要ということではありませんか?


いまは、unistd.hが見つからないという単純なコンパイルエラーですね。

ヘッダーファイル(xxx.h)には、ライブラリ関数の型宣言とかしてあるのでは?
いちど内容を確認したほうがいいと思います。

fork()関数の詳細は、関数リファレンスで確認してください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!