• ベストアンサー

fork1()とfork()の違い

SolarisをターゲットとするC言語の開発をしなくてはいけなくなりました。 ところが、Solaris環境がないためとりあえずCygwinで開発を行っています。 そこで、まず既存の部分を動作させたいのですが、子プロセスの生成にfork1()を使用していてコンパイルエラーになります。 このfork1()とfork()の違いがわかるかたいたら教えてください。

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

手元の Solaris 8 のマニュアルを読んでみたところ Solaris のスレッドには Solarisモデルと POSIXモデルがあるということで, ・pthread をリンクすると POSIXモデルになる. このときには fork を使う ・thread をリンクすると Solarisモデルになる. このときには fork1 を使う ようです. まあ pthread をリンクして fork を使うことにした方が安全じゃないでしょうか. ちなみに POSIXモデルで fork1 を使ったり Solarisモデルで fork を使うこともできます. 子プロセスが exec を呼出すだけなら問題ないようですが, それを超えると子プロセスでデッドロックする可能性もあるとか.

potedora
質問者

お礼

回答ありがとうございます。 とりあえずコンパイルできればいいのでpthreadをリンクしました。 たいへん助かりました。

関連するQ&A

  • fork()2

    質問を途中で投稿してしまいました^^; 前質問はNo.945866 forkをしたときは子プロセスが生成されるのはわかるのですが、生成されたあとは、子プロセスからまず開始されるのでしょうか? if(fork() == 0){.....} else { .....} と if(fork() != 0){.....} else { .....} の両方の形で記述してもどちらも子プロセス側から走っていました。環境に依存するというわけではないのでしょうか?

  • 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を実行すればできそうだと思ったのですがうまく動かず・・・。 どうか正しく動くようなプログラムを教えてください!お願いします。

  • プロセスの生成(fork)

    私はLinuxを始めたばかりのタコです。 参考書で少しずつ勉強しているのですが 「プロセスの生成にはforkを使用する」と記載されており プログラム例も載ってはいるのですが親プロセスと子プロセス一個の ケースしか記載されていません。 例にはPIDが0か0以外で親子を判断して別処理をさせると書いてありました。 例えば親プロセスと子プロセス2個以上を生成するにはどうしたらいいのでしょう?超ビギナーな質問で申し訳ありませんがタコを育てると思って どうか御教え下さい。宜しく御願いします。

  • C言語のバージョン違いのコンパイルについて

    C言語で Solaris9のmakefile、ソースをそのまま利用し Solaris10上でコンパイル可能でしょうか? コンパイルした所、 -------------------------- aaa.mk:構文エラー 行 10: '(' unexpected -------------------------- というエラーが出ましたが、 Solaris10向けにmakefileを見直さないと行けないのでしょうか?

  • ファイルをオープンしたまま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しているのになぜまたファイルに同じ内容が書き込まれるのでしょうか?

  • forkで作れる子プロセス数が限られている

    for($i=0;$i<1000;$i++) { if($p=fork) { next; } elsif(defined($p)) { sleep 10000; exit; } else { print("$i\n"); <STDIN>; } } 数十個で子プロセスが生成されなくなります メモリは十分あまってます デスクトップヒープ領域が足りなくなったわけじゃなさそうです どうすればメモリが足りる限り子プロセスを生成できるでしょうか? windows xp avtive perl 5.8.7です。

    • ベストアンサー
    • Perl
  • C言語の実行モジュール、コンパイル

    2点程、教えて頂きたい事があります。 よろしくお願いします。 (1)Solaris9でC言語でコンパイルされた実行モジュールを、そのままSolaris10にコピーし実行した場合、実行できるのでしょうか? (2)Solaris10で、makefile等を利用しC言語のコンパイルをしようと思うのですが、Solaris10がインストールされた段階で既にコンパイルする環境は整っているのでしょうか?。それともCD等からコンパイル環境をインストールしないといけないのでしょうか?(Solarisメディアが無い場合にコンパイル可能でしょうか?)

  • python: fork後の標準出力について

    言語はpythonです。(バージョン : 2.6.6) 以下の二つの単純なpythonスクリプト   test.py, exe_fork.py があります。 [test.py] #!/usr/bin/env python import subprocess proc = subprocess.Popen("./exe_fork.py", stdout=subprocess.PIPE) result = proc.stdout.read() print result [exe_fork.py] #!/usr/bin/env python import os import time pid = os.fork() if pid != 0: print "parent\n" else: time.sleep(5) print "child\n" [動作] 各スクリプトの動作としては、 test.pyがexe_fork.pyをPopen(stdoutはPIPEで受信)で実行し、 read()メソッドでexe_fork.pyの標準出力を受け取り、表示する。 exe_fork.pyはforkして、   親プロセスは"parent"と出力   子プロセスは5秒後に"child"と出力 です。 [実行結果] test.pyを実行すると 5秒後に   parent   child と表示されました。 これを実行する前は実行後すぐに "parent" と表示されてスクリプト終了するのだと予想しておりました。 しかし実際はexe_fork.pyの親と子の両方のプロセス終了するまで何も表示されず 両プロセスが終了した後にtest.pyのread()メソッドが完了するようです。 (どういうしくみでそうなっているのかよくわかりません。。) [質問・相談] test.pyでexe_fork.pyの親プロセスの標準出力だけを反映する方法ございませんでしょうか? なお、都合上、以下の条件を満たしている必要がございます。  条件1: test.py側のソースは変更しない  条件2: exe_fork.pyの親プロセスが終了した時点でtest.pyのread()メソッドが終了する  条件3: forkptyは使わない [参考]  exe_fork.py側で子プロセスのみsys.stdout.close()してみましたが結局exe_fork.pyの子プロセスが終了するまで(=5秒経過するまで)test.pyのread()メソッドは完了しませんでした。   よろしくお願いします。

  • UNIXでのプログラム

    UNIXでプロセス管理に関するC言語のプログラムを作りたいと思っています。そこで、次にあげる3つのことを表示したいのですが、どうすればよいかわかりません。教えてもらえませんか? fork()前のプロセスID 親プロセスでは自信のプロセスIDとそこで生成した子プロセスのID 子プロセスでは自身のプロセスIDと親のプロセスID よろしくお願いします。

  • forkで子が親を終了させるか?

    fork() によって作られた子プロセスが、親プロセスを終了させる場合があるでしょうか? 形としては良く見かけるもので次のようになっています。 pid_t pid = fork(); if (pid < 0) {  エラー処理  return; } else if (pid == 0) {  子の処理 ... (1)  _exit(0); } /* ここが実行されない場合がある */ return; (1)の箇所に sleep() を幾らか入れると再現しなくなります。 親子の関係で子が親へ影響を与えることがあるでしょうか?