从fortran关闭shell
我在fortran程序中使用从fortran关闭shell,shell,fortran,Shell,Fortran,我在fortran程序中使用系统调用(“操作”)例程来执行外部命令。如果调用命令,我想关闭shell。 我随附的示例代码是: program ai implicit none integer :: i i=1 if (i.eq.1 ) then call system("exit") end if end program ai 我也尝试过使用调用EXECUTE\u COMMAND\u LINE,但结果是一样的,我无法关闭正在工作的shell。我必须从shell本身手动键入命令ex
系统调用(“操作”)
例程来执行外部命令。如果调用命令,我想关闭shell。
我随附的示例代码是:
program ai
implicit none
integer :: i
i=1
if (i.eq.1 ) then
call system("exit")
end if
end program ai
我也尝试过使用调用EXECUTE\u COMMAND\u LINE
,但结果是一样的,我无法关闭正在工作的shell。我必须从shell本身手动键入命令exit
,以关闭它。猜猜为什么这个命令不起作用?例如,mkdir
,gnuplot
。。工作
谢谢 system()
创建一个新的shell,并给它一个运行命令。它无法向您启动程序的先前存在的shell发出命令
也就是说,
gfortran
确实有一个电话。如果您拥有父shell的PID——通过调用getppid()
C函数——您可以通过该机制请求它退出。因为Fortran程序是shell的子程序,而系统
命令从内部调用的任何东西都是该程序的子程序,这并不像你想要的那么简单
一个想法是使用fortranKILL
子例程(它显然也是一个函数)终止父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 $$
这将向调用shell发送硬终止信号,然后终止调用shell。(我尝试过使用更柔和的kill信号,如3(QUIT)和15(TERM),但这两种信号都不起作用,可能是因为shell仍然有一个孩子(即Fortran程序本身))
当然,这意味着程序必须使用$
选项启动,并且将其放入shell脚本也不会起作用,因为shell脚本将在原始shell的子进程中执行
如果您的程序在stdout上不产生任何输出,您也可以让它只打印退出
到标准输出,然后在shell中使用以下命令调用它:
$(<your program>)
$()
(包括
$
符号)“为什么”-因为系统(“退出”)
启动一个全新的shell并在该shell中运行退出
;它不会改变您以前运行的任何shell的状态。我不确定它是否可以工作。如果你运行这个程序,这个程序是shell的“子”程序,当你调用system
时,它又是你程序的child
。这也是为什么使用system(“cd/”)
不会有任何效果的原因:当函数返回时,您修改其状态的shell已完成执行并退出。值得注意的是,kill
不是标准Fortran的一部分,它的可用性将取决于所使用的编译器和可用库。同样,OP系统也不是标准的,它的行为因编译器和操作系统而异。