2011-05-21 9 views
6

Me estoy preparando para escribir un núcleo de jueces en línea,
Un programa que puede compilar el código del usuario y ejecutar el programa para verificar la respuesta como uva juez en línea.¿Puedo usar SetErrorMode en el proceso de C#?

Y estoy teniendo problemas para detectar la excepción de enviar programa como a continuación.

int main() 
{ 
    while(~scanf("%d %d",n,&m)) 
    { 
     printf("%d\n",n+m); 
    } 
    return 0; 
} 

es acceso denegado en la primera línea porque escanea un número entero a la posición de error.
¿cómo puedo detectar el error de tiempo de ejecución para mi proceso?

Solía ​​utilizar "try catch" para capturar la excepción,
pero no respondió nada sobre el error de tiempo de ejecución.

por lo que sólo marque el código de salida del programa de someter a pesar de que no es un buen método para comprobar excepción de un proceso ..
y se nota como photo

tengo que cerrar el cuadro de mensaje de error de forma manual,
y encuentro una solución que es usar una DLL SEH Handler para el proceso.

SetErrorMode(SEM_NOGPFAULTERRORBOX); 

pero no sé cómo usarlo en el proceso C#.

y por debajo es mi código de juzgador

timer = new Stopwatch(); 
timer.Reset(); 

submitProg = new Process(); 
submitProg.StartInfo.FileName = outputFile; 
submitProg.StartInfo.UseShellExecute = false; 
submitProg.StartInfo.CreateNoWindow = true; 
submitProg.StartInfo.RedirectStandardInput = true; 
submitProg.StartInfo.RedirectStandardOutput = true; 
submitProg.StartInfo.RedirectStandardError = true; 
submitProg.StartInfo.ErrorDialog = false; 
submitProg.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
submitProg.EnableRaisingEvents = true; 

submitProg.Start(); 
timer.Start(); 

progInput = submitProg.StandardInput; 
progOutput = submitProg.StandardOutput; 

progInput.Write(inputStream.ReadToEnd()); 
submitProg.StandardInput.Close(); 
while (!submitProg.HasExited) 
{ 
    peakPagedMem = submitProg.PeakPagedMemorySize64; 
    peakVirtualMem = submitProg.PeakVirtualMemorySize64; 
    peakWorkingSet = submitProg.PeakWorkingSet64; 
    if (peakPagedMem > memLimit) 
    { 
     submitProg.Kill(); 
    } 
    if (timer.ElapsedMilliseconds > timeLimit) 
    { 
     timeLimitExceed = true; 
     submitProg.Kill(); 
    } 
} 

timeUsed = timer.ElapsedMilliseconds; 
timer.Stop(); 

if(submitProg.ExitCode!=0)systemRuntimeError = true; 

Gracias por ayudar, y así lo siento por mi mala Inglés.

===============================
p.s.
la pregunta es cómo puedo configurar el modo de error para el proceso secundario en C#.
Mi inglés no es lo suficientemente bueno para explicar el problema, lo siento mucho. < (_ _)>

+0

Tener unos pocos cuadros de error no debería ser un problema, ya que en cualquier caso, tiene que guardarlo bastante bien.Puedes matar el arenero y el proceso con él. –

Respuesta

5

No se puede establecer el modo de error en otro proceso sin necesidad de insertar código en ese proceso. Lo cual es imposible de hacer fácilmente en C#. Tampoco va a funcionar bien en C/C++, este tipo de programas no viven lo suficiente como para que tengas tiempo para inyectarte.

No resuelve su problema de todos modos, también tiene que protegerse contra programas que nunca salen después de que se atascaron en un bucle sin fin. La solución simple es dar a cada programa una cantidad limitada de tiempo para ejecutar. Diga 10 segundos. Si no se completa, Process.Kill() y declara una falla. Esto también se encargará de los programas que bombardean con un cuadro de mensaje.

Trivial para implementar con la sobrecarga Process.WaitForExit (milisegundos).

10

Si se refiere a la función API de Win32 SetErrorMode entonces usted tendrá que utilizar P/Invoke, que es fácil con una simple firma por ejemplo:

[DllImport("kernel32.dll")] 
static extern ErrorModes SetErrorMode(ErrorModes uMode); 

[Flags] 
public enum ErrorModes : uint { 
    SYSTEM_DEFAULT    = 0x0, 
    SEM_FAILCRITICALERRORS  = 0x0001, 
    SEM_NOALIGNMENTFAULTEXCEPT = 0x0004, 
    SEM_NOGPFAULTERRORBOX  = 0x0002, 
    SEM_NOOPENFILEERRORBOX  = 0x8000 
} 

(El Sitio http://www.pinvoike.net/ es siempre una buena lugar para comenzar a obtener la declaración correcta.)

+0

¿También funciona en procesos secundarios? – Nekosyndrome

+0

@kannaduki No se menciona en MSDN que esto es heredado por procesos secundarios; por lo tanto, esperaría que * no * se herede. – Richard

+0

Parece que no se hereda. ¿Cómo puedo configurar el modo de error para my child process @@? Gracias. – Nekosyndrome

Cuestiones relacionadas