============== Cygwinバージョン

============== 
Cygwinバージョン

foo.exe対話型入力を必要とする古いFortran実行可能ファイルがあります。

foo.exeCywinでダイヤルすると、インタラクティブな入力を要求するメッセージが表示され、プログラムが正しく実行されます。

WSLから呼び出すと、foo.exe対話型入力を要求するメッセージが表示され、プログラムが正しく実行されます。


foo.exeインタラクティブにすべての内容を入力する必要がないように、スクリプトを実行したり入力を送信したいと思います。

Cygwinでは、次のことを行います。

foo.exe << EOI
1
1
Test
Out
EOI

すべて大丈夫!

WSLで同じことをしようとしましたが、次のエラーメッセージが表示されました。

forrtl: An attempt was made to move the file pointer before the beginning of the file.
forrtl: severe (39): error during read, unit -4, file CONIN$
Image              PC        Routine            Line        Source
libifcorert.dll    1003A159  Unknown               Unknown  Unknown


そこで、元のファイルをインポートし、foo.f次のように再コンパイルしようとしました。gfortran

gfortran foo.f -o new_foo.exe

その後、Cygwinでインタラクティブな呼び出しを試み、new_foo.exe次のようになりました。

bash: ./newfoo.exe: cannot execute binary file: Exec format error

したがって、Cygwinで動作していた機能は機能しなくなりました。

その後、WSLで対話型呼び出しを試みましたが、new_foo.exe正常に動作しました。

これで、WSLを使用してスクリプトを実行したり入力を送信new_foo.exeしたり、正常に動作しましたが(以前はこれを実行できませんでした)、Cygwinはこれを実行する機能を失いました。一歩前進、二歩後退? ?


それから私は32ビットを使って再コンパイルする必要があると思いました。

gfortran -m32 foo.f -o new_foo_32.exe

この32ビットコンパイルプログラムはCygwinまたはWSLでは機能しないため、次のエラーが発生します。

bash: ./newfoo.exe: cannot execute binary file: Exec format error

最後の目標は、CygwinとWSLで対話的に実行できる単一のfoo.exeプログラムを持つことです(元のコードで実行されています)。そしてCygwinとWSLの両方で入力をパイプ/転送できます。元のコードでは、Cygwinでのみこれを実行できました。

どんな提案がありますか?

==============
Cygwinバージョン

CYGWIN_NT-10.0-WOW 
<computer> 2.4.1(0.293/5/3) 
2016-01-24 11:24 i686 Cygwin

==============
WSLバージョン

Linux <computer> 4.4.0-18362-Microsoft 
#476-Microsoft Fri Nov 01 16:53:00 PST 2019 
x86_64 x86_64 x86_64 GNU/Linux

Distributor ID: Ubuntu
Description:    Ubuntu 20.04.2 LTS
Release:        20.04
Codename:       focal

答え1

.exeCygwinで生成されたファイルにはCygwinへの依存関係があると思います。そうですか?少なくとも標準入力パイプ処理に関する限り、明らかにそうです。

PowerShellでこれを行うとどうなりますか?

@"
1
1
Test
Out
"@ | foo.exe

WSLで見られるのと同じエラーが発生することを願っています(少なくとも正しい方向に行くように)。

(WSLから)どうですか?

/mnt/C/cygwin/bin/bash.exe -c "foo.exe" << EOI
1
1
Test
Out
EOI

対照的に、WSLではコンパイラはLinux ELFバイナリを生成する必要がありますが、.exeCygwinはそれをWindowsで起動しようとするかもしれませんが、.exeそうではありません。

関連情報