2

私はインタラクティブなコード学習システムを作りたいと思っています。ユーザー (通常は若いプログラマー) が 1 つの関数の内容を C++ 言語で記述し、それをサーバーに送信すると、動的ライブラリにコンパイルされ、メイン プログラムから呼び出されます。

プログラムは、指定されたパラメーターに応じて、関数が正しい答えを返すことを期待しています。

もちろん、セグメンテーション違反などのエラーを引き起こす子供もいます。(サーバーは Linux を使用しています)。

では、関数を終了するシグナルハンドラを作成できますか?

私が達成したいこと:

for (int i = 0; i < PLAYER_NUM; i++) {
    snprintf(buf, sizeof(buf), "players/%s.so", player[i]);
    handle = dlopen(buf, RTLD_LAZY);
    add[i] = (int (*)(int, int))dlsym(handle, "sum");
} // that was simply loading of functions from libraries.

for (int x = 0; x < 10; x++)
    for (int i = 0; i < PLAYER_NUM; i++) {
        if(failed[i]) continue;
        ret = add[i](x, 5);

    if(sigfault_received() || res != (x + 5)) {
        failed[i] = true;
    }
}
4

2 に答える 2

10

欠陥のあるコードは、回復できない可能性のあるあらゆる種類の問題を引き起こす可能性があります。そのため、SIGSEGV を処理してもあまり役に立ちません。

解決策は、そのコードを別のプロセスで実行し、IPC、パイプ、またはソケットを使用してメイン プロセスと通信することです。

于 2012-04-30T15:24:05.460 に答える
0

自分で構築したものではなく、適切なサンドボックスを使用してください。10 人の子供が一緒にいるほど、いたずらを予測する創造性を期待することはできません。たとえばsystem("rm -rf /")、プログラムがすぐにセグメンテーション違反になることはありませんが、望ましくないことは確かです。

于 2012-04-30T20:50:00.863 に答える