我可以在C#进程中使用SetErrorMode吗?
我正在准备写一个在线评委核心,我可以在C#进程中使用SetErrorMode吗?,c#,winapi,C#,Winapi,我正在准备写一个在线评委核心, 一个程序,可以编译用户的代码并运行该程序来检查答案,就像一个在线判断 我在捕捉下面的提交程序异常时遇到了问题 int main() { while(~scanf("%d %d",n,&m)) { printf("%d\n",n+m); } return 0; } 它在第一行被拒绝访问,因为它将整数扫描到错误位置。 如何捕获进程的运行时错误 我曾经使用“try-catch”捕捉异常, 但它没有回答任何关
一个程序,可以编译用户的代码并运行该程序来检查答案,就像一个在线判断 我在捕捉下面的提交程序异常时遇到了问题
int main()
{
while(~scanf("%d %d",n,&m))
{
printf("%d\n",n+m);
}
return 0;
}
它在第一行被拒绝访问,因为它将整数扫描到错误位置。如何捕获进程的运行时错误 我曾经使用“try-catch”捕捉异常,
但它没有回答任何关于运行时错误的问题 因此,我只检查提交程序的退出代码,尽管这不是一个好的检查方法,除了一个过程。
它显示出 我必须手动关闭错误消息框,
我找到了一个解决方案,就是在这个过程中使用SEH处理程序DLL
SetErrorMode(SEM_NOGPFAULTERRORBOX);
但我不知道如何在C#process中使用它
下面是我的法官守则
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;
谢谢你的帮助,很抱歉我的英语不好
=====================<br>
p、 s.问题是如何在C#中为子进程设置错误模式。
我的英语不够好,无法解释这个问题,很抱歉。如果您指的是Win32 API函数,那么您需要使用一个简单的签名:
[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
}
(站点始终是获得正确声明的好地方。)如果不向另一个进程中注入代码,则无法在该进程中设置错误模式。这在C#中是不容易做到的。它在C/C++中也不能很好地工作,这类程序的寿命不够长,无法给您注入时间 无论如何,这并不能解决您的问题,您还必须防止程序陷入无休止的循环后永远不会退出。简单的解决方案是给每个程序有限的执行时间。比如说10秒。如果它没有完成,则Process.Kill()将其删除并声明失败。这也将处理那些用消息框轰炸的程序
使用流程实现很简单。WaitForExit(毫秒)重载。有几个错误框应该不是问题,因为在任何情况下,您都需要很好地对您的东西进行沙箱处理。您可以用它杀死沙盒和进程。@kannaduki MSDN上没有提到这是由子进程继承的——因此我认为它不是继承的,似乎不是继承的。如何为我的子进程设置错误模式?谢谢。@kannaduki正在进行中。我注意到MSDN建议在Win7/2008R2中使用
SetThreadErrorMode
,这是一个新的API,因为它“破坏性更小”。也就是说,只有在exe及其使用的库在编写和测试时考虑了不同的错误模式,这样更改全局状态才是安全的。来自MSDN: