我必须使用具有“菜单样式”界面的 FORTRAN 代码。我在终端上输入命令来访问代码,从而打开主菜单。从那时起,我输入一个数字并输入它来选择一个选项,该选项可以打开子菜单或执行命令。要退出,我必须导航回主菜单并输入“0”以结束代码并“返回终端”。例如,在终端上我输入:
code_command %
打开 FORTRAN 代码主菜单
1
→ 我从主菜单中选择选项 1,这将打开一个子菜单;
2
→ 从子菜单 1 中,我通过输入选项 2 来选择另一个子菜单;
7
→ 从这个第二个子菜单中,我选择执行所需任务的第 7 个选项。
0
→ 我从第二个子菜单返回
0
→ 我从第一个子菜单返回(到主菜单)。
0
→ 我留下代码并返回终端
因此,我编写了一个为执行某项任务必须输入的命令列表,并将此文本保存为“script.sh”,为了让代码执行此列表,我输入:
code_command < script.sh
最后,除了最后一行之外,它完美地执行了所有行,当它崩溃时,我必须打开其他终端并输入:
pkill code_command
或Ctrl+Z在崩溃的终端窗口内。
有没有办法 在 中编写一个Ctrl+来在崩溃之前终止正在运行的代码?Zscript.sh
答案1
我假设您正在使用 bash,尽管这也适用于 sh 和 csh。
首先:将 ulimit 核心设置为非零(这样您就可以创建核心转储)。man bash
然后搜索 ulimit。。bashulimit -c <max size of core dump>
默认为无核心转储,每次打开新窗口或启动新会话时都必须重新输入。
第二步:运行程序,在另一个窗口中kill -3 <pid>
查看程序是否仍在运行并获取核心转储。查看man 7 signal
“SIGQUIT”或“-3”选项。
第三。使用gdb
查看导致问题的语句。您必须使用“-g”选项编译程序。gdb <fortran executable name> core
. gdb
可用于交互式调试。(这远远超出了您提出的问题)。
从你在问题中提到的内容来看,你没有正确处理“<input”或 stdin 的 EOF,也没有退出命令循环并停止。或者你处于无限循环中或在子菜单中等待输入。finally 会在进程kill -3 <pid>
挂起的位置终止进程。
Ctrl+正在暂停正在运行的 fortran 程序。可执行文件在挂起时仍在运行。如果您输入foregroundz命令,fortran 程序将从+之前的位置继续运行。fg
Ctrlz