2012-11-19 11 views
14

fork()を使用してプロセスのコピーを作成します。 私のプロセスのコピーに引数を渡す方法がわかりません。 たとえば、プロセスコピーに整数を渡したいとします。fork()によって作成されたプロセスに引数を渡す方法

それとも何をすべきか、私はフォーク(コールするループを持っている場合)とプロセスに一意の値を渡したい(例えば0 ... N)

for (int i = 0; i < 4; ++i) { 
    fork(); 
    // pass a unique value to new processes. 
} 
+2

'fork'は進行中のプロセスのコピーを作成しますが、プロセスを開始しません。 – Beta

+0

http://advancedlinuxprogramming.com/ –

答えて

15

fork()についての素晴らしい部分はあなたが自動的に出現し、各プロセスは、すべてのコピーを取得していることである親は、例えばので、我々は2つのプロセスのそれぞれにint型myvarを渡したいが、私は、それぞれが親プロセスとは異なる値を持つようにしたいとしましょう:これをやって

int main() 
{ 
    int myvar = 0; 
    if(fork()) 
     myvar = 1; 
    else if(fork()) 
     myvar = 2; 
    else 
     myvar = 3; 

    printf("I'm %d: myvar is %d\n", getpid(), myvar); 
    return 0; 
} 

は、各プロセスがmyvarの「コピー」を持つことができますそれは自分の価値です。

I'm 8517: myvar is 1 
I'm 8518: myvar is 2 
I'm 8521: myvar is 3 

値を変更しなかった場合、各forkプロセスの値は同じになります。

+0

マイクに感謝します。あなたは頭の上に釘を打つ –

1

exec() familyを参照してください。機能。

EDIT:基本プロセスと同じプログラムのコピーを初期化しようとしている場合は、duskwuffが示唆するように変数をそのまま使用してください。

1

クローン()(実際にはfork()自体で使用されます)を使用できます。入力機能にを渡すことができます。

http://linux.die.net/man/2/clone

+3

を読んでください。いいえ、しないでください。 'clone'は複雑なLinux特有のシステムコールです。これはLinuxに関する非常に優れた知識を必要とするもので、スレッドライブラリ(* pthread)を実装する少数のgurus *にはほとんど予約されています。 'futex(7)'のマニュアルページも参照してください。 –

+0

@BasileStarynkevitch:そうです。実際の低レベルのハッキングを行っている場合にのみクローンを使用してください。クローンの唯一のポイントは、以前はスレッド実装などのカーネル空間でしか起こり得なかったユーザ空間でいくつかのことを可能にすることです。一般的なシステムコールではありません。 – Linuxios

7

ローカルおよびグローバル変数は、本質的にfork()渡って保存されるので、「引数を渡す」する必要はありません。あなたはフォークプロセス内の関数を呼び出している場合は、あなたのような何かを行うことができます:

pid_t pid = fork(); 
if (pid == 0) { 
    funcToCallInChild(argument); 
    exit(0); 
} 
6

私は対応が遅れてんだけど、ここで私はそれを行う方法です。

const char *progname = "./yourProgName"; 
const char *argument1 = "arg1"; 
const char *argument2 = "arg2"; 

if (fork() == 0) 
{ 
    // We are the child process, so replace the process with a new executable. 
    execl(progname, progname, argument1, argument2, (char *)NULL); 
} 
// The parent process continues from here. 

まず、あなたは()新しいプロセスを作成するためのプロセスをフォーク。それはまだ古いものと同じメモリ空間を持っています。 fork()は、親プロセスと子プロセスの両方を返します。 fork()がゼロを返す場合、あなたは子プロセスです。子プロセスはexecl()を使用してプロセスメモリを新しいファイルのものに置き換えます。

prognameがexecl()に2回指定されていることに注意してください。最初はexecl()が実際に実行しようとするもので、2番目はargv [0]です。あなたは両方を提供しなければならないか、引数の数が1つ減ってしまいます。 Prognameには、必要な実行可能イメージを見つけるために必要なすべてのパス情報が含まれている必要があります。

この例では2つの引数を指定しますが、必要な数だけ渡すことができます。それはNULLで終了する必要があり、私はあなたがそれを(char *)としてキャストしなければならないと思います。

このアプローチは、引数と一意のPIDを持つ完全に独立したプロセスを提供します。親プロセスが終了してから長く実行し続けることもできますし、親プロセスの前に終了することもできます。

関連する問題