如何判断程序崩溃

New*_*Mrd 3 c linux

如何判断正在运行的程序是崩溃还是成功终止?

我用 运行程序system('exe'),并且我有 的源'exe'代码C

我更喜欢在代码中添加一些代码之类的解决方案'exe's。喜欢atexit(someFunction)- 但atexit不致力于exceptions-。

我正在使用Linux。

pho*_*xis 5

system返回:

如果出现错误(例如 fork(2) 失败),则返回值为 -1,否则返回命令的状态。后一个返回状态采用 wait(2) 中指定的格式。因此,该命令的退出代码将为 WEXITSTATUS(status)。如果 /bin/sh 无法执行,退出状态将是执行 exit(127) 的命令的状态。

因此存储的返回值system,然后检查返回值。如果您的“exe”返回成功代码,您将知道它已成功终止,否则如果您的代码返回特定错误代码,那么您将知道那是什么错误,否则您可以假设代码崩溃了。

正如 Ingo Leonhardt 在评论中所说,您可以使用WTERMSIG()WIFSIGNALED()宏来检查信号,以测试返回值system,以检查是否发生了信号,如果是,则检查是哪个信号。

这是一个简单的例子:

bad.c会出现段错误。

#include <stdio.h>

int main (void)
{
  char *p = "Hello";

  p[1] = 'X';

  return 1;
}
Run Code Online (Sandbox Code Playgroud)

system.c执行错误。

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

int main (void)
{
  int retval;

  retval = system ("./bad");
  if (!WIFSIGNALED(retval))
  {
    printf ("Process completed successfully\n");
  }
  else
  {
    switch (WTERMSIG(retval))
    {
      case SIGINT: printf ("SIGINT\n");
                 break;
      case SIGSEGV: printf ("SIGSEGV\n");
                  break;

      case SIGQUIT: printf ("SIGQUIT\n");
                  break;
    }
  }
  printf ("EXIT STATUS: %d\n", WEXITSTATUS(retval));
  return 0;
}  
Run Code Online (Sandbox Code Playgroud)

但推荐的过程是使用exec家庭和wait家庭。这些将使您更好地控制流程的执行。

看: