Cプログラムを実行可能ファイルにコンパイルすると、システムに依存した方法で実行されます。 UbuntuではELF形式が使用され、WindowsではPEが使用されます。
プロセスを開始すると、メモリを割り当てる方法と、プロセスのさまざまな部分を仮想メモリテーブルに配置する方法についての説明と地図が表示されます。さらに、同じライブラリを使用している他のプロセスと共有する、すでに物理メモリにある動的にロードされたライブラリにリンクします。動的ライブラリが存在しない場合は、それらをロードします。 (Linux .so、windows .dll)。静的ライブラリがある場合、これらは割り当てられ、リンクされます(Linux .a、Windows .lib)。 - 非常に単純化された。
メモリ制限などは、前のプロセスから継承されます。
環境変数はプロセスの実行環境に入れられます。これはパス、引数などです。次にmain()
がスタックに追加されて呼び出されます。
メインが呼び出される前に起こっていたこと、リンケージなどが解決されたことなど、他の多くのことはシステムによって異なります。これは、Windows上のLinuxでコンパイルされた実行可能ファイルを実行できない理由です。
cygwin
を使用すると、これらのリンケージなどが同じで動作する仮想環境を作成するだけです。 1つはELF環境を作成します。
ネイティブのWindowsコマンドラインにリンクするには、Windows用にコンパイルする必要があります。そのことについてはすでに多くの回答があることがわかります。
ELFとPEは、異なるシステムと同様に、環境変数などを扱う方法が異なります。これらは何かなどです。つまり、ファイルの展開は別の方法で処理されます。しかし、両方の実行中のプロセスは、stderr
,stdout
およびstdin
のようなデフォルトのストリームを持っています。しかしの下にあなたのコードは同じではありません。
ディーゼルとガソリン車を運転するようなものです。多くは同じですが、フードの下でかなりのものが異なります。
Windowsでは信号が異なっていることに注意してください。
"シミュレートされたコマンドライン"のようなものはありません。 Windowsには、Linuxと同じように、ネイティブcommmand-lineインターフェイスがあります。 –
@KerrekSB:Cygwinは、Windows上でUnixライクな環境を提供します。 Cygwinのコマンドラインは、Windowsコマンドラインではありません。 – celtschk
@celtschk:Cygwinは、まずWin32用のPosix APIです。それにはいくつかの追加の端末サポートがありますが、それはOPの状況の中心ではありません。 –