C でfork()を使用してプロセスのコピーを作成したいと考えています。プロセスのコピーに引数を渡す方法がわかりません。たとえば、プロセスのコピーに整数を渡したいとします。
または、fork() を呼び出すループがあり、プロセスに一意の値 (例: 0...N) を渡したい場合はどうすればよいですか?
for (int i = 0; i < 4; ++i) {
fork();
// pass a unique value to new processes.
}
C でfork()を使用してプロセスのコピーを作成したいと考えています。プロセスのコピーに引数を渡す方法がわかりません。たとえば、プロセスのコピーに整数を渡したいとします。
または、fork() を呼び出すループがあり、プロセスに一意の値 (例: 0...N) を渡したい場合はどうすればよいですか?
for (int i = 0; i < 4; ++i) {
fork();
// pass a unique value to new processes.
}
良い点fork()
は、生成した各プロセスが自動的に親プロセスのすべてのコピーを取得することです。たとえば、myvar
2 つの子プロセスのそれぞれに int を渡したいが、それぞれに親プロセスとは異なる値を持たせたいとします。処理する:
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 を持つ完全に独立したプロセスが得られます。親プロセスが終了した後も長く実行し続けるか、親プロセスよりも前に終了する可能性があります。
clone()を使用できます(これは実際には fork() 自体によって使用されます)。エントリ関数に引数を渡すことができます。
exec()
関数ファミリーを参照してください。
編集: 基本プロセスと同じプログラムのコピーを初期化しようとしている場合は、duskwuff で提案されているように変数を使用し続けてください。