从fortran关闭外壳

时间:2017-03-10 00:31:54

标签: shell fortran

我在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来关闭它。有什么猜测为什么这个命令不起作用?例如,mkdirgnuplot ..有效吗?

谢谢!

2 个答案:

答案 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函数 - 您可以请求它通过该机制退出。