Jeśli umieściłem ten temat w złym dziale to przepraszam [wstyd].. uznałem ten za najodpowiedniejszy.
Piszę system do obsługi zawodów programistycznych (coś pokroju sio.mimuw.edu.pl czy spoj.pl). Istotą działania takiego systemu jest automatyczna kompilacja i uruchamianie programów nadsyłanych przez zawodników. Programy takie powinny mieścić się w wyznaczonym czasie, nie przekraczać limitu pamięci oraz nie wywoływać żadnych system call'i oprócz komunikacji przez std. input / std. output i (de)alokacji pamięci.
O ile z mierzeniem czasu i ubijaniem procesu po jego przekroczeniu sobie poradziłem, o tyle problem sprawia mi limitowanie pamięci oraz zabezpieczenie przed syscallami.
Podczas googlowania natrafiłem na funkcję setrlimit(). W Internecie i w man'ie są niby wyjaśnione zasady posługiwania się, ale z niewiadomego mi powodu ten oto kod:
#include <cstdio>
#include <cstdlib>
#include <unistd.h>
#include <sys/time.h>
#include <sys/resource.h>
int main(int argc, char *argv[])
{
//if (argc < 4) return -1;
rlimit limit;
char* path = argv[1];
int meml = atoi(argv[2]);
int timel = atoi(argv[3]);
fprintf(stderr, " Path: %s\n Meml: %d bytes\n Timel: %d secs\n", path, meml, timel);
limit.rlim_cur = limit.rlim_max = meml;
fprintf(stderr, "setrlimit 1: %d\n", setrlimit(RLIMIT_AS, &limit));
limit.rlim_cur = limit.rlim_max = timel;
fprintf(stderr, "setrlimit 2: %d\n", setrlimit(RLIMIT_AS, &limit));
system(path);
}
nie uruchamia żadnego programu podanego jako argument. Setrlimit zwraca zera, więc limity niby się ustawiają.. i są wystarczająco duże (10 MB RAMu, 1000 sekund), ale system() zachowuje się tak, jakby go nie było.
Jak już wspomniałem, drugi problem dotyczy syscalli. Chcę ubijać programy natychmiast po wywołaniu czegoś, co wykracza poza kompetencje programu (alokacja pam., wczytanie z wejścia, obliczenia, wypisywanie na wyjście). Czy da się to zrobić w minimalnie inwazyjny sposób (bez modyfikacji kernela)? Znalazłem takie coś na http://qsorix.jogger.pl/startid/282736 :
Zadanie jail'a polega na uruchamianiu programów w środowisku o limitowanym dostępie do funkcji systemowych, pamięci i czasu procesora. Po przekroczeniu narzuconych limitów wykonywany program będzie mordowany.
Programik przydatny do jakichś amatorskich turniejów programistycznych itp. Więcej w paczce w pliku docs/introduction.txt
co wydaje się być lekarstwem na me bolączki... ale niestety, za linkiem kryje się 404 ;-(
Będę bardzo, bardzo wdzięczny za pomoc.