3

新しいプロセスを実行するプログラムを C で作成し、forkそのプロセスpidを別の関数に使用する必要があります。ただし、子プロセスを実行する前にこの関数を呼び出す必要があり、その方法がわかりません。

ここに私がやろうとしていることのいくつかの疑似コードがあります。

pid_t pid = fork();
if(in_child){    //In the child process
    //launch child application
    //somehow stop the child application before it actually executes any code
}
else{
    //call my function with the child's pid
    //resume the child process
    //do other stuff
}

追加情報が必要な場合は、お問い合わせください。ありがとう。

編集:子供のコードにアクセスできません。実行可能ファイルを実行したいだけです。

4

3 に答える 3

2

なんらかのコードを意味する場合、それは難しい場合があります。アプリケーションを停止状態で開始する代わりにclonewithを使用できます(再開するには SIGCONT が必要です)。CLONE_STOPPEDfork

ただし、単に子の特定のコードを意味し、子コードを変更できる場合は、 の最初のことのようにmain、シグナルのハンドラーを設定するだけですUSR1(どの IPC もおそらくそうしますが、この中ではシグナルが最も単純に思えます)。特定のケース)、続行する前に起動するのを待ちます。

そうすれば、プロセス自体は実行されますが、まだ何も実行されません。

次に、親に必要な魔法を織り込んでもらい、SIGUSR1 を子に送信します。


しかし、コメントによると、クライアントコードにアクセスできないためSIGCONT、実際に子供に問題が発生しないと仮定すると、最初のオプションが最適な場合があります。それにはテストが必要です。


もちろん、心に留めておくべきことの 1 つは、新しいプログラムを実際に子プロセスにロードすることもしないことです。これは、分割後に -type 呼び出しで実行する必要clone()があります。これは、 UNIX がとの機能を分割した結果です。詳細はこちらを参照してください。fork()execforkexec

つまり、子プログラムを制御なくても子プロセスを制御できるため、コードは新しい子プログラムをロードする前に必要な信号を待機できます。したがって、だけでも実行可能fork()です。

残念ながら、それはまた、新しいプログラムがロードされた後にプロセスを停止することも停止することcloneもできないことも意味します(少なくとも決定論的にではありません)。メモリ)、それはできません。forkexec

あなたができる最善のことは、古いプログラムのコピーがまだある間に、新しいプロセスをいじることです(の前exec)。

于 2013-04-29T01:28:23.317 に答える