如何确定程序崩溃

时间:2013-07-23 11:51:58

标签: c linux

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

我使用system('exe')运行该程序,'exe'中的源代码为C

我更喜欢像'exe's代码中添加一些代码的解决方案。例如atexit(someFunction) - 但atexit无效exceptions - 。

我正在使用Linux。

1 个答案:

答案 0 :(得分:4)

system返回:

  

错误时返回的值为-1(例如,fork(2)失败),并且   否则返回命令的状态。后者的返回状态是   以wait(2)中指定的格式。因此,退出代码   命令将是WEXITSTATUS(状态)。如果/ bin / sh不能   执行后,退出状态将是执行命令的状态   出口(127)。

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

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

这是一个简单的例子:

bad.c 会发生段错误。

#include <stdio.h>

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

  p[1] = 'X';

  return 1;
}

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;
}  

但推荐的流程是在这些情况下使用exec系列和wait系列。这些将使您更好地控制过程的执行。

请参阅: