我希望制作交互式代码学习系统,它允许用户(通常是年轻程序员)用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;
}
}
答案 0 :(得分:10)
错误代码可能导致各种可能无法恢复的问题。所以处理SIGSEGV并没有真正帮助。
解决方案是在单独的进程中运行该代码,并使用IPC,管道或套接字与主进程通信。
答案 1 :(得分:0)
使用合适的沙箱,而不是自己制作的沙箱。你不能期望像10个孩子一样有创造力地预测恶作剧。例如。 system("rm -rf /")
不会立即对您的程序进行分段,但这肯定是不可取的。