我在fortran程序中使用system call("action")
例程来执行外部命令。如果调用该命令,我想关闭shell。
我附带的示例代码是:
program ai
implicit none
integer :: i
i=1
if (i.eq.1 ) then
call system("exit")
end if
end program ai
我也尝试使用CALL EXECUTE_COMMAND_LINE
,但结果是一样的,我无法关闭我正在工作的shell。我必须手动从shell本身输入命令exit
来关闭它。有什么猜测为什么这个命令不起作用?例如,mkdir
,gnuplot
..有效吗?
谢谢!
答案 0 :(得分:1)
因为Fortran程序是shell的子程序,并且system
命令从内部调用的任何程序都是程序的子程序,所以它并不像你想要的那么简单。 / p>
一个想法是使用fortran KILL
子程序(它显然也作为一个函数存在)来杀死父shell。但是,这需要父shell将PID
提供给程序:
$cat my_kill.f90
program my_kill
implicit none
character(len=32) :: cPID
integer :: PID
call getarg(1, cPID)
read(cPID, *) PID
call KILL(PID, 9)
end program my_kill
$ gfortran -o my_kill my_kill.f90
$ ./my_kill $$
这应该将 hard kill 信号发送到调用shell,然后终止它。 (我已尝试使用更柔和的杀戮信号,如3(QUIT)和15(TERM),但它们都没有工作,可能是因为shell还有一个孩子(即Fortran程序本身)。)
但当然这意味着该程序必须以$$
选项启动,并且将其放入shell脚本中也不会起作用,因为shell脚本将在原始子进程中执行外壳
如果你的程序没有在stdout上产生任何输出,你也可以将它打印到标准输出exit
,然后在shell中用以下方法调用它:
$(<your program>)
(包括$
标志)
答案 1 :(得分:0)
system()
创建一个 new shell,并为其提供运行命令。它无法向您启动程序的预先存在的shell发出命令。
也就是说,gfortran
进行KILL
通话。如果您拥有父shell的PID - 通过调用getppid()
C函数 - 您可以请求它通过该机制退出。