は、私は、プロセスをフォークした場合、すべての変数があまりにもクローニングされ、このダイナミックに割り当てられた変数をSIGTERMで解放するには?
... HEADERS ...
int *var;
void child() {
... //some work
free(var);
exit(EXIT_SUCCESSFUL);
}
int main(void) {
...
//allocate variable
var = (int *) malloc(N*sizeof(int));
... //work with var
for(int i; i<PROC_COUNT; i++) {
pid_t child = fork();
if(pid == 0) {
child(); //main function of new proces
break;
}
elseif(pid < 0) {
//there is enormous problem -> kill every proces
kill(0, SIGTERM);
waitpid(0, NULL, 0); //wait for children
free(var);
exit(EXIT_FAILURE);
}
}
free(var);
return EXIT_SUCCESS;
}
のようなコードを何かに取り組んでいます。通常、varのすべてのコピーが解放されます。
fork()
でエラーが発生した場合は、作成したすべてのプロセスにシグナルSIGTERMを送信します。そして、私はSIGTERMのシグナルハンドラを書く必要があります。これは、varを解放してアプリケーションを終了させます。しかし、free()はsignal safe function
ではありません - 私はそれを呼び出すべきではありません。しかし、その変数を解放する方法は?
あなたの答えに感謝をたくさん...
EDIT:valgrindのもまだreacheable変数を示しています
==5928== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 15 from 1)
==5928== malloc/free: in use at exit: 20 bytes in 1 blocks.
==5928== malloc/free: 1 allocs, 0 frees, 20 bytes allocated.
==5928== For counts of detected errors, rerun with: -v
==5928== searching for pointers to 1 not-freed blocks.
==5928== checked 49,164 bytes.
Enourmouse?それはある種の大きな先史時代のげっ歯類ですか? :-) – JesperE
私はあなたのご容赦を願います、それはスロバキアで少し遅れているので、私は間違っていました。通知ありがとう。 – izidor