0

プログラムの編成方法が原因で、execvp() を使用して呼び出したい C++ 関数があります。

これは可能ですか?

4

3 に答える 3

5

execvp() を含むすべての exec バリアントは、ファイルシステムに表示される完全なプログラムのみを呼び出すことができます。幸いなことに、すでにロードされているプログラムで関数を呼び出したい場合、必要なのは fork() だけです。次の疑似コードのようになります。

int pid = fork();
もし (pid == 0) {
    // ここで関数を呼び出します。これは新しいプロセスであり、
    // 行った変更は親に反映されません
    // 変数。次のようなファイルや共有リソースには注意してください
    // データベース接続。
    _exit(0);
}
そうでなければ (pid == -1) {
    // エラーが発生し、fork() が失敗しました。これは非常にまれです
    // エラーですが、処理する必要があります。
}
そうしないと {
    // 子が終了するのを待ちます。シグナルハンドラを使用できます
    // 子プロセスに時間がかかる場合は、後でキャッチします。
    waitpid(pid, ...);
}
于 2009-03-16T01:14:42.843 に答える
2

excecvp()は、関数ではなくプログラムを開始することを意味します。そのため、その関数をコンパイル済みの実行可能ファイルにラップし、そのファイルのメインで関数を呼び出す必要があります。

于 2009-03-16T01:06:35.153 に答える
0

プロセスの作成は非常に重い場合があります。本当に関数を並行して呼び出したいだけなら、スレッドを使用しないでください。BoostQTACEなどの C++ のスレッド化をサポートする、プラットフォームに依存しないライブラリが多数利用可能です。

関数を別のプロセスで実行する必要がある場合は、forkまたはvforkを使用できます。vfork はすべてのプラットフォームで使用できるわけではなく、欠点もあるため、使用できるかどうかを確認してください。フォークを使用しない場合。

于 2009-04-09T17:15:13.380 に答える