From a74ade667435b11b48590e8a5f05772207b1f980 Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Thu, 31 Mar 2005 23:05:31 +0000 Subject: [PATCH] Bugfix. Al forkear procesos, la salida estandar y de error se las ligaba a un pipe. Pero el pipe se leia recien cuando el proceso forkeado finalizaba. Si se llenaba el buffer del sistema operativo para el pipe, se quedaba en un 'deadlock', el padre esperando a que termine el hijo y el hijo esperando que el padre lea del pipe. Ahora se guardan todas las salidas en disco y se las lee despues. --- src/sc_test | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/sc_test b/src/sc_test index 4eab7bb..e936e2e 100755 --- a/src/sc_test +++ b/src/sc_test @@ -61,13 +61,14 @@ def compilar(intento, mail): # Compilo log.debug('Ejecutando: make -f %s', makefile) intento.inicioCompila = datetime.datetime.now() - make = subprocess.Popen(('make', '-f', makefile), stderr=subprocess.PIPE, + stderr = file(os.path.join(intento.path, 'make.out'), 'w') + make = subprocess.Popen(('make', '-f', makefile), stderr=stderr, cwd=intento.path) make.wait() intento.finCompila = datetime.datetime.now() log.debug('Fin del comando: make -f %s', makefile) # Verifico compilación - stderr = make.stderr.read() + stderr = file(os.path.join(intento.path, 'make.out')).read() intento.compila = not make.returncode msg = 'Compilación: ' if intento.compila and not stderr: @@ -144,13 +145,18 @@ def probar(intento, caso_de_prueba, mail): 'cwd': intento.chrootPath(caso_de_prueba), 'close_fds': True, 'preexec_fn': secure_process(intento.chrootPath(caso_de_prueba), uid, gid, tiempo_cpu), + 'stdin': None, + 'stdout': None, + 'stderr': None, } if usa_stdin(): options['stdin'] = file(os.path.join(caso_de_prueba.path, 'stdin'), 'r') if usa_stdout(): - options['stdout'] = subprocess.PIPE + stdout_fn = intento.chrootPath(caso_de_prueba) + '.stdout' + options['stdout'] = file(stdout_fn, 'w') if usa_stderr(): - options['stderr'] = subprocess.PIPE + stderr_fn = intento.chrootPath(caso_de_prueba) + '.stderr' + options['stderr'] = file(stderr_fn, 'w') # Ejecuto programa params = ['/tp'] if caso_de_prueba.parametros: @@ -222,11 +228,11 @@ def probar(intento, caso_de_prueba, mail): prueba.pasada = True # Asumo que está bien, ya habrá tiempo para cambiarlo obs = '' if usa_stdout(): - obs += diff(prueba, mail, proc.stdout.readlines(), + obs += diff(prueba, mail, file(stdout_fn).readlines(), file(os.path.join(caso_de_prueba.path, 'stdout')).readlines(), caso_de_prueba.nombre + '.stdout', longname='La salida estándar') if usa_stderr(): - obs += diff(prueba, mail, proc.stderr.readlines(), + obs += diff(prueba, mail, file(stderr_fn).readlines(), file(os.path.join(caso_de_prueba.path, 'stderr')).readlines(), caso_de_prueba.nombre + '.stderr', longname='La salida de error') for f in caso_de_prueba.archivosSalida: -- 2.43.0