Cでfork()を使用してプロセスのコピーを作成したい。プロセスのコピーに引数を渡す方法がわからない。たとえば、プロセスコピーに整数を渡したいとします。
または、fork()を呼び出すループがあり、プロセスに一意の値を渡したい場合はどうすればよいですか(0 ... Nなど)
for (int i = 0; i < 4; ++i) {
fork();
// pass a unique value to new processes.
}
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()
全体で保持されるため、「引数を渡す」必要はありません。フォークされたプロセスで関数を呼び出す場合は、次のようなことができます。
pid_t pid = fork();
if (pid == 0) {
funcToCallInChild(argument);
exit(0);
}
返信が遅れていますが、その方法は次のとおりです。
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()は、親プロセスと子プロセスの両方を返します。 fork()がゼロを返す場合、あなたは子プロセスです。次に、子プロセスはexecl()を使用して、プロセスメモリを新しいファイルのメモリに置き換えます。
Prognameがexecl()に2回与えられていることに注意してください。 1つ目はexecl()が実際に実行しようとするもので、2つ目はargv [0]です。両方を指定する必要があります。そうしないと、引数の数が1つ減ります。 Prognameには、目的の実行可能イメージを見つけるために必要なすべてのパス情報が含まれている必要があります。
この例では2つの引数を指定しますが、必要な数だけ渡すことができます。 NULLで終了する必要があり、私が示すように(char *)としてキャストする必要があると思います。
このアプローチは、引数と一意のpidを使用して完全に独立したプロセスを提供します。親プロセスが終了した後も実行を継続することも、親プロセスの前に終了することもできます。
関数の exec()
family を参照してください。
編集:基本プロセスと同じプログラムのコピーを初期化しようとしている場合は、duskwuffによって提案された変数を引き続き使用してください。
clone()(実際にはfork()自体によって使用されます)を使用できます。 argをエントリ関数に渡すことができます。