Sto eseguendo una sorta di "sandbox" in C su Ubuntu: prende un programma e lo esegue in modo sicuro sotto l'utente nobody
(e intercetta segnali, ecc.). Inoltre, assegna memoria e limiti di tempo e misura il tempo e l'utilizzo della memoria.
(Nel caso foste curiosi, è per una sorta di "giudice online" per contrassegnare i programmi sui dati di test)Utilizzo memoria di un processo figlio?
Attualmente ho adattato il modulo safeexec da mooshak. Sebbene la maggior parte delle cose funzioni correttamente, l'utilizzo della memoria sembra essere un problema. (È molto impreciso)
Ora ho provato il consiglio here e analizzato VM da /proc/pid/stat
, e ora il problema di precisione è stato risolto. Tuttavia, per i programmi che terminano molto rapidamente non funziona e solo restituisce 0.
Il safeexec programma sembra funzionare in questo modo:
- E
fork()
s - Utilizza
execv()
nel processo figlio per eseguire il programma desiderato - Monitora il programma dal processo padre fino al termine del processo figlio (utilizzando
wait4
, che si verifica per restituire l'utilizzo della CPU, ma non la memoria?)
Quindi analizza/proc/../stat
del processo figlio (che è stato sostituito dal execv)
Allora perché VM in /proc/child_pid/stat
volte uguale a 0?
È perché execv() termina troppo rapidamente, e /proc/child_pid/stat
non è disponibile?
Se è così, c'è una sorta di altro modo per ottenere l'utilizzo della memoria del bambino?
(Dal momento che questo è pensato per giudicare i programmi entro un limite di tempo, non posso permettermi qualcosa con una penalità di prestazioni come valgrind)
Grazie in anticipo.
Hmm, sembra interessante. Comunque, per rintracciare gli array statici/automatici? –
Wow, ptrace è davvero pulito. Grazie! (Dato che ptrace fa in modo che il processo figlio si interrompa quando esegue execv() s, sono in grado di misurare l'utilizzo della memoria non appena inizia) –