C言語 fork()について

このQ&Aのポイント
  • C言語でのSystem Call fork()について説明します。
  • Visual Studio 2008で実行する際に発生したエラーについて解決方法を教えてください。
  • include <unistd.h>について説明します。
回答を見る
  • ベストアンサー

C言語 fork()について

C言語 fork()について C言語でSystem Call fork()というものがあるそうで、まずは http://cai.int-univ.com/sugsi/Lecture/NetProg/chapter5/fork.html こちらのサイトの例を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ファイルか何かを準備しておく必要があるということですかね...

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

>#include <unistd.h>もfork()を使うときに必要なものだろう程度に思っているのですが、どうすれば、まずこのプログラムが実行できるんでしょうか? 認識は合っています。 が…… >こちらのサイトの例をvisual studio 2008で実行させてみようと Windows環境にfork()システムコールはありません。 cygwinインストールして、gccでやれば……システムコールではありませんが 動作するかも知れませんが。 # 未検証です。 C言語でも、「環境依存」はする。 というコトです。

その他の回答 (2)

回答No.3

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.aspx こいつを使うと新しいプロセスを作ることはできますが、新しく作られたプログラムの先頭から実行するのでfork()というより、fork()後にexecを実行したのと同等の動作になりますけどね。 さらに余談ですが、WindowsとUnixでほぼ似た様なコードを書きつつ並列処理をさせる場合はスレッドを使います。スレッドを作るのはWindowsだと_beginthreadexで、Unixだとpthread_createと関数名も引数も全く違いますが、ここを#ifdefで切り替えて、ハンドルとpthread_t型変数の取り扱いさえ#defineなどで誤魔化せばうまく動きますからね。(昔、バイトでWindows XPとFreeBSDで動くスレッドプールライブラリを作ったことがあります) というわけで、Windowsなのでfork()は使えませんし、unistd.hなんてヘッダファイルもありませんが、あしからず。でも、スレッドだったらかなりいい線いったコードが書けます。

noname#119957
noname#119957
回答No.1

#includeはコンパイル時に、そのファイルをその場所にあるかのように取り込んでくるだけなので、指定のファイルパスにそのヘッダーファイルが必要ということではありませんか? いまは、unistd.hが見つからないという単純なコンパイルエラーですね。 ヘッダーファイル(xxx.h)には、ライブラリ関数の型宣言とかしてあるのでは? いちど内容を確認したほうがいいと思います。 fork()関数の詳細は、関数リファレンスで確認してください。

関連するQ&A

  •  現在、私はC言語を学んでいます。

     現在、私はC言語を学んでいます。  プログラミングの初期の初期の問題なんですが、 「Hello World」という有名なプログラムがありますよね? それについての質問です。 #include<stdio.h> main() { printf("Hello World"); return 0; } も #include<stdio.h> main(void) { printf("Hello World"); return 0; } も #include<stdio.h> int main() { printf("Hello World"); } もちゃんと表示できます。 ここで質問です。 int main(void) int main() main() main(void) はどう違うんですか? あと、 return 0; はあっても無くてもいいようなんですが どういう意味があるんでしょうか?

  • forkについて

    fork文を使った問題について質問です。 #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { pid_t pid1,pid2; if((pid1 = fork()) == 0) printf("I am a first child with pid = %d,My parent pid is %d.\n",getpid(),getppid()); else if(( pid2 = fork()) == 0) printf("I am a second child with pid = %d,My parent pid is %d.\n",getpid(),getppid()); else printf("I am a parent with pid = %d.\nMy first and second children are %d and %d.\n",getpid(),pid1,pid2); exit(EXIT_SUCCESS); } このようなプログラムが与えられました。 問題は 1.このプログラムを改造して、1つの親プロセスから100の子プロセスを順に生成するプログラムをつくるというものと 2.1つの親から子プロセスを生成し、その子プロセスの孫プロセスを生成するプログラムをつくれというものです。 1はfor文を使えばできそうなのですが、forkの基礎が出来ていないのでどうループを回せばよいか分かりません。 2もfork内でforkを実行すればできそうだと思ったのですがうまく動かず・・・。 どうか正しく動くようなプログラムを教えてください!お願いします。

  • C言語プログラミングについて

    #include <stdio.h> int main(void) { printf("hello,world\n"); } □■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■ #include <stdio.h> int main(void) { printf("hello"); printf(",world"); printf("\n"); } 上の2つのプログラムをコンパイルするとどのような違いが生じるんですか??printfってどんな働きをするんですか?

  • 別ターミナルへのprintf出力

    LinuxでC言語プログラムから新しいターミナルを開き、そこにprintfで文字を出力したいのですがどうやったら良いのでしょうか?下記プログラムを作ってみましたが、新しいターミナルが開くだけで文字が出力されません #include <pthread.h> #include <stdio.h> #include <unistd.h> #include <signal.h> void* thread(void* arg) {  int pid=0;  pid = fork();  if(pid==0)  {    execlp("gnome-terminal","gnome-terminal",NULL);     printf("Hello World!!\n");  } } int main() {   pthread_t th;  void* result;   pthread_create(&th, NULL,thread, NULL);  pthread_join( th,&result); }

  • C言語

    以下のようなhello.cがあります。 include<stdio.h> int main(void) { printf("Hello World! \n"); return 0; } gcc -E hello.c と打つとプリプロセッサが表示されます。 課題はこの中からprintfに関するものを見つけ、読み取れることを説明せよとのことです。 問題の意図と解き方がわかりません。 よろしくお願いします。 環境はwsl ubuntu です。

  • C言語のシェルプログラミングの課題が分かりません。

    C言語のシェルプログラミングを作れという課題で、以下のように作ったんですが、実行して何度かコマンドを入力した後、exitによって一発で終わらせることができません。どのように書き換えればいいか教えて下さい。 また、他にも書き換えた方がよいと思えるところがあったら是非教えて下さいm(_ _)m #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/wait.h> #include <sys/types.h> #include MAX_ARGS 10 #include MAX_LEN 100 extern char **environ; void child(int argc, char *argv[MAX_ARGS]); int main(void){ int argc, n = 0; int status; char input[MAX_LEN], *argv[MAX_ARGS], *cp; const char *delim = "\t\n"; while (1){ ++n; printf("$ "); fflush(stdout); if(fgets(input, sizeof(input), stdin) == NULL){ break; } cp = input; for(argc = 0; argc < MAX_ARGS; argc++){ if((argv[argc] = strtok(cp, delim)) == NULL) break; cp = NULL; } if(strcmp(argv[0], "exit") == 0){ exit(0); } pid_t pid = fork(); if(pid == -1){ perror("fork"); exit(1); }else if(pid == 0){ child(argc, argv); }else{ wait(&status); } } return 0; } void child(int argc, char *argv[MAX_ARGS]{ execvp(argv[0], argv); }

  • C言語でいきなりつまづいてます。

    C言語でいきなりつまづいてます。 何がダメなのかご教授ください。 OSはウインドウズXPです。 (1)Borland C++ Compiler 5.5 With Command Line Tools Version 5.5.1をインストールしました。 (2)BCC5.5.1 環境ファイルパス設定プログラムをインストールしました。 (3)以下のソースを書きました。 #include <stdio.h> int main(void) { printf("Hello, \nworld"); return 0; } (4)hello.cというファイル名で保存しました。 (5)コマンドプロンプトでフォルダを(4)のファイルが置いてあるフォルダに指定し bcc32 hello.cと入力しました。 (6)出力が   hello.c になります。 エラーなどはありません。 以上です。 よろしくお願いします。

  • ファイルをオープンしたままfork

    ファイルをオープンしたままforkした際の動作について質問です。 下のコードを書いてコンパイル、実行します。 #include <stdio.h> int main(int argc, char **argv){ FILE *fp; fp=fopen("file", "w"); fprintf(fp, "%d\n", getpid()); printf("%d\n", getpid()); fork(); } ====== $ gcc hoge.c -o hoge.out $ ./hoge.out XXX ←pid なぜかファイル内には同じpidが2つ書かれている。 $ cat file XXX XXX fork()によって生成されたプロセスが元のプロセスのファイルを参照することは予想できます。 しかしforkする前にfprintしているのになぜまたファイルに同じ内容が書き込まれるのでしょうか?

  • C言語について

    #include <stdio.h> int main(void) { printf("123456\tABC DEFGHIJK\n"); printf("2006/4/14\n"); printf("programing\n"); } のprintfをすべてputsに書き換えてコンパイル・実行すると、 #include <stdio.h> int main(void) { puts("123456\tABC DEFGHIJK\n"); puts("2006/4/14\n"); puts("programing\n"); } になると思うんですけど、そのputsを用いて上のprintfを用いたプログラムと同じ出力を得るにはどのようなプログラムに変えればいいのでしょうか?

  • cygwinwをC言語のコンパイラとして使う方法

    cygwinをダウンロードして、 さっそくCのコンパイラとして使おうと思って#include<stdio.h> int main(void) { printf("Hello, World!");} を、ダウンロードの際に作られたhomeというフォルダに入れて、 gcc hello.c (hello.cというファイル名にしました) と入力しましたが、 hello.c:3:28: warning: no newline at end of file と出てきてしまい、実行ファイルを作れませんでした。 どうやったらコンパイルができるようになるか、 どんなことでもいいので、ご存知の方、 どうか教えてください! (メモ帳、windowsXPを使っていて、 恥ずかしいことですが、バージョンはわかりません・・・ 超初心者です、ごめんなさい・・・)

専門家に質問してみよう