C++ 程序终止时调用函数

C++ 程序终止时调用函数,c++,C++,我在HPC上运行一些C++程序,使用SLURM进行调度。有时我的程序会被杀死,要么是因为它们使用了太多的资源,要么是因为它们运行的时间太长。通常,如果我的程序运行完毕,或者遇到内部错误,我会收到一条消息,告诉我这一事实,并且我可以应用适当的操作。 但是,如果我的程序被队列管理器终止,我不会得到任何消息,是的,我指定要在作业文件中获得这些消息,但不知何故,这无法正常工作。因此,我想知道当遇到终止信号时,是否有可能调用程序内的函数,或者用另一种方式告诉我主程序何时终止?也许你可以换一种方式看。在程序

我在HPC上运行一些C++程序,使用SLURM进行调度。有时我的程序会被杀死,要么是因为它们使用了太多的资源,要么是因为它们运行的时间太长。通常,如果我的程序运行完毕,或者遇到内部错误,我会收到一条消息,告诉我这一事实,并且我可以应用适当的操作。
但是,如果我的程序被队列管理器终止,我不会得到任何消息,是的,我指定要在作业文件中获得这些消息,但不知何故,这无法正常工作。因此,我想知道当遇到终止信号时,是否有可能调用程序内的函数,或者用另一种方式告诉我主程序何时终止?

也许你可以换一种方式看。在程序结束前一点停止程序,并尽你的责任创建一个干净的出口。使用slurm,您可以使用:

#SBATCH --signal=B:USR1@120
在作业限制前120秒向bash脚本发送信号。只需捕捉这个信号,并产生一个干净的出口

我使用它,而且效果很好

#!/bin/bash -l

# job name
#SBATCH --job-name=example

# replace this by your account
#SBATCH --account=...

# one core only
#SBATCH --ntasks=1

# we give this job 4 minutes
#SBATCH --time=0-00:04:00

# asks SLURM to send the USR1 signal 120 seconds before end of the time limit
#SBATCH --signal=B:USR1@120

# define the handler function
# note that this is not executed here, but rather
# when the associated signal is sent
your_cleanup_function()
{
    echo "function your_cleanup_function called at $(date)"
    # do whatever cleanup you want here
}

# call your_cleanup_function once we receive USR1 signal
trap 'your_cleanup_function' USR1

echo "starting calculation at $(date)"

# the calculation "computes" (in this case sleeps) for 1000 seconds
# but we asked slurm only for 240 seconds so it will not finish
# the "&" after the compute step and "wait" are important
sleep 1000 &
wait

这些行是从IIRC中提取的。如果你的程序被SIGKILL aka-9杀死,那么杀死信号是不可截获的。那你就无能为力了。内核将以复仇的方式终止您的进程。其他信号,比如SIGTERM-15,你可以捕获并尝试使用。有没有办法检测我的程序是被SIGKILL还是SIGTERM杀死的?@arc_lube为你捕获的信号,当然。对于像SIGKILL这样的东西,不,你已经死了。