我有一个应用程序,可以用来捕捉任何分段错误或ctrl-c.

可能吗?

void SignalInit(void )
{

struct sigaction sigIntHandler;

sigIntHandler.sa_handler = mysighandler;
sigemptyset(&sigIntHandler.sa_mask);
sigIntHandler.sa_flags = 0;
sigaction(SIGINT, &sigIntHandler, NULL);
sigaction(SIGSEGV, &sigIntHandler, NULL);

}

handler是这样的.

void mysighandler()
{
MyfreeBuffers(); /*related to my applciation*/
}

对于分段故障信号,处理程序被多次调用,显然MyfreeBuffers()会给我释放已释放内存的错误.我只想自由一次,但仍然不想退出应用程序.

请帮忙.

推荐答案

SIGSEGV之类的默认操作是终止进程,但当您为其安装了处理程序时,它将调用您的处理程序来覆盖默认行为.但问题是,segfaulting指令可能会在处理程序完成后重试,如果您没有采取措施修复第一个seg故障,重试的指令将再次出错,并继续执行.

因此,首先找出导致SIGSEGV的指令,并try 修复它(您可以在处理程序中调用类似backtrace()的命令,自己看看哪里出了问题)

此外,POSIX标准规定,

进程从正常状态返回后,其行为未定义

所以,理想的做法是首先修复您的故障.Handler for segfault is not meant to bypass the underlying error condition

所以最好的建议是-Don't catch the 100.让它倾倒核心.分析核心.修复无效的内存引用,就这样!

Linux相关问答推荐

如何将netcdf文件列表中的特定变量添加到不同的文件中?

从 ALSA USB 硬件设备获取 USB 设备文件路径

重新运行时避免 Linux bash 脚本中的文件重命名重复

`__meminit` 在 Linux 内核中意味着什么?

为什么组合的查找和重命名命令在 bash shell 下不能按预期工作?

为什么 liburing 写入性能低于预期?

如何从 AWK 中的 CSV 列中获取中值? (Linux)

在android上使用lldb-server进行lldb调试?

如何在ubuntu中通过.sh文件启动多个服务

有没有办法定义自定义隐式 GNU Make 规则?

sig_atomic_t 实际上是如何工作的?

用于判断 shell 脚本是否正在运行的 Linux 命令

为什么这个命令会杀死我的 shell?

yum 可以告诉我哪些存储库提供了特定的包吗?

'&&' 与 '&' 与 Bash 中的 'test' 命令

如何在没有空格的情况下打印 awk?

如何设置errno值?

解压tar tar.bz2 文件报错

ldconfig 错误:使用 Linux 加载程序时不是符号链接

如何计算一个单词在目录的所有文件中出现的次数?