在c++中,进程获得SIGABRT的场景是什么?这个信号总是来自进程内部还是可以从一个进程发送到另一个进程?

有没有办法确定是哪个进程在发送这个信号?


当前回答

你可以使用kill(2)接口向任何进程发送任何信号:

杀死 -SIGABRT 30823

30823是我启动的一个破折号进程,所以我可以很容易地找到我想要终止的进程。

$ /bin/dash
$ Aborted

Aborted输出显然是dash报告SIGABRT的方式。

它可以使用kill(2)直接发送给任何进程,或者进程可以通过assert(3)、abort(3)或raise(3)将信号发送给自己。

其他回答

它通常发生在内存分配有问题的时候。

当我的程序试图分配一个 大小为负的数组。

libc和其他库通常使用SIGABRT在出现严重错误时中止程序。例如,glibc在检测到double-free或其他堆损坏时发送SIGABRT。

此外,大多数断言实现在断言失败的情况下使用SIGABRT。

此外,SIGABRT可以像其他信号一样从任何其他进程发送。当然,发送进程需要以相同的用户或根用户运行。

你可以使用kill(2)接口向任何进程发送任何信号:

杀死 -SIGABRT 30823

30823是我启动的一个破折号进程,所以我可以很容易地找到我想要终止的进程。

$ /bin/dash
$ Aborted

Aborted输出显然是dash报告SIGABRT的方式。

它可以使用kill(2)直接发送给任何进程,或者进程可以通过assert(3)、abort(3)或raise(3)将信号发送给自己。

在c++中还有另一个简单的原因。

std::thread::~thread{
    if((joinable ())
        std::terminate ();
}

例如,线程范围结束,但你忘记调用

thread::join();

or

thread::detach();

abort()向调用进程发送SIGABRT信号,这就是abort()的基本工作方式。

Abort()通常由库函数调用,用于检测内部错误或一些严重破坏的约束。例如,如果malloc()的内部结构被堆溢出破坏,它将调用abort()。