Mengapa java.exe tidak terlihat dari cygwin, tetapi terlihat dari command-prompt?

Jawaban:

14

Dalam edisi x64 Windows 8/7 / Vista, isi folder C: \ Windows \ System32 tergantung pada bitness aplikasi.

Untuk aplikasi 64-bit (seperti Windows Command Prompt, cmd.exe) , tidak ada pengalihan sistem file:
C:\Windows\System32(dalam perangkat lunak) -> C:\Windows\System32(pada disk).
Jadi, folder C: \ Windows \ System32 berisi file DLL dan EXE 64-bit, dari sudut pandang aplikasi 64-bit.

Untuk aplikasi 32-bit (seperti bash.exedari Cygwin) yang berjalan melalui subsistem WoW64 pada Windows x64, ada dua pengalihan dalam sistem file:
C:\Windows\System32(dalam perangkat lunak) -> C:\Windows\SysWOW64(pada disk).
C:\Windows\Sysnative(dalam perangkat lunak) -> C:\Windows\System32(pada disk).
Jadi, folder C: \ Windows \ System32 berisi file DLL dan EXE 32-bit, dari sudut pandang aplikasi 32-bit.

Jika Anda ingin mengakses aplikasi 64-bit dan file DLL (seperti java*.exe) dari aplikasi 32-bit (seperti Cygwin bash.exe), Anda perlu menggunakan C:\Windows\Sysnativejalur, atau /cygdrive/c/Windows/Sysnativedalam notasi Cygwin.

(ini adalah jawaban yang diperbarui dan diperluas)

Mikhail Kupchik
sumber
Ya, mereka ada di sana: Chloe @ xps / cygdrive / c / Windows / sysnative $ ls -la java * -rwx ------ + 1 SYSTEM SYSTEM 188320 7 Maret 7 04:43 java.exe
Chloe
Kenapa bisa begitu? Saya tidak dapat melihat sysnative dari DOS prompt.
Chloe
2
Jadi, bash.exe cygwin berjalan sebagai aplikasi 32-bit dan dalam konteks itu C: \ Windows \ System32 dipetakan ke C: \ Windows \ SysWOW64 (folder tanpa file java *). Prompt perintah Windows (cmd.exe) berjalan sebagai aplikasi 64-bit sehingga ia dapat melihat true C: \ Windows \ System32. Gunakan C: \ Windows \ sysnative untuk mengakses direktori system32 sebenarnya dari aplikasi 32-bit. Informasi lebih lanjut tentang topik ini: msdn.microsoft.com/en-us/library/windows/desktop/…
Mikhail Kupchik
Wow itu benar-benar mundur dan membingungkan!
Chloe
1
Ya, mereka seharusnya membuat direktori \ Windows \ system64 untuk file DLL dan EXE sistem 64-bit, tetapi sayangnya kami memiliki file 64-bit di direktori System32 dan pengalihan sistem file yang canggung.
Mikhail Kupchik