ToDo:
waitが真(default)の場合、cmdstat引数を省略するとコマンドが見つからない場合、Fortran runtime errorでプロセスが終了する(gfortran8.3で確認)
waitが偽の場合は、cmdstat引数の有無に依らずexecute_command_lineは成功する (cmdstatの戻り値は常に0、exitstatは更新されない)
非同期実行時にエラーハンドルできなくなる理屈は理解できるが、動作が一貫してない気がする…
さらに調べると、Fortran runtime errorの発生条件は正確にはcommand not foundでは無くexitstatの戻り値で決まる模様(gfortran8.3の実装)
少なくともgfrotran8.2の実装では、exitsat=127だとFortran runtime errorとなる(exitstat=126も同様)
call execute_command_line('exit 1', exitstat=i) write(*,*)'exit 1 -> ', i call execute_command_line('exit 127', exitstat=i) write(*,*)'exit 127 -> ', i
libgfotranをバラしてみるとそのものズバリのコードが
/* Synchronous execution. */ int res = system (cmd); if (res == -1) set_cmdstat (cmdstat, EXEC_SYSTEMFAILED); #ifndef HAVE_FORK else if (!wait) set_cmdstat (cmdstat, EXEC_SYNCHRONOUS); #endif else if (res == 127 || res == 126 #if defined(WEXITSTATUS) && defined(WIFEXITED) || (WIFEXITED(res) && WEXITSTATUS(res) == 127) || (WIFEXITED(res) && WEXITSTATUS(res) == 126) #endif ) /* Shell return codes 126 and 127 mean that the command line could not be executed for various reasons. */ set_cmdstat (cmdstat, EXEC_INVALIDCOMMAND); else set_cmdstat (cmdstat, EXEC_NOERROR);
stdoutのredirectionまで考慮すると、自前でsystem(3)総統を実装すべきか? (シグナル処理回りの可搬性が気になる所だが…)
カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記