我一切顺利,我的程序在大约N秒内完成:
./maybe_deadlock
但有时候随机发生死锁,程序会永远挂起。
为了调试这个,我想沿着以下几行运行程序:How to debug a rare deadlock?
while true; do
date
gdb -ex 'set confirm on' -ex run -ex quit --args ./maybe_crash.out;
done
但为了使事情更方便,我想在N秒过后收到通知,所以我不必继续检查终端以查看stdout是否卡住了。
换句话说,如果N秒过去并且程序没有完成,我想从以下命令运行任意命令:https://unix.stackexchange.com/questions/144924/how-to-create-a-message-box-from-the-command-line。
我知道来自timeout
的How to kill a child process after a given timeout in Bash?命令,但我不想杀死我的进程,因为我想在之后在GDB上检查它。
我想我可以提出一个丑陋的解决方案,将进程置于后台,休眠,等待并触及一个哨兵文件,但让我们看看是否有更优雅的方法。
该程序可以测试解决方案:
#define _XOPEN_SOURCE 700
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
int main() {
if (time(NULL) % 2) {
sleep(3);
} else {
while (1) {
sleep(0x7FFFFFFF);
}
}
return EXIT_SUCCESS;
}