Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从fortran关闭shell_Shell_Fortran - Fatal编程技术网

从fortran关闭shell

从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

我在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本身手动键入命令
exit
,以关闭它。猜猜为什么这个命令不起作用?例如,
mkdir
gnuplot
。。工作

谢谢

system()
创建一个新的shell,并给它一个运行命令。它无法向您启动程序的先前存在的shell发出命令


也就是说,
gfortran
确实有一个电话。如果您拥有父shell的PID——通过调用
getppid()
C函数——您可以通过该机制请求它退出。

因为Fortran程序是shell的子程序,而
系统
命令从内部调用的任何东西都是该程序的子程序,这并不像你想要的那么简单

一个想法是使用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 $$
这将向调用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系统也不是标准的,它的行为因编译器和操作系统而异。