CLR上でcygwinの関数を使ってみると
CLRでcygwin1.dllの関数が使いたい
なんでそんな事したいねん、ってのはおいといて
普通にCLRから呼び出すと、そら当然やけどメモリ違反やフリーズしたりする
作戦1
C言語で「cygwin_dll_init」呼び出した後「CorBindToRuntimeEx」でCLRを実行する
はしょると大体こんな感じ
#include <windows.h> #include <mscoree.h> #include <corerror.h> void mainCRTStartup() { char cygtls[32768]; DWORD exitcode = -1; ICLRRuntimeHost *host = NULL; HRESULT hr; cygwin_dll_init(); hr = CorBindToRuntimeEx( NULL, L"wks", 0, &CLSID_CLRRuntimeHost, &IID_ICLRRuntimeHost, (VOID**)&host ); host->lpVtbl->Start(host); hr = host->lpVtbl->ExecuteInDefaultAppDomain(host, "a.exe", "Main", "cygwin_startup", "", &exitcode); host->lpVtbl->Stop(host); host->lpVtbl->Release(host); ExitProcess(exitcode); }
エラー処理無いとえらいシンプルやなぁ。。。
作戦2
cygwin_startupっていうエントリポイントを作って、ここから呼ばれたときはもうcygwinの初期化が済んでいるはず
あとはCLR上で普通にDllImportAtributeつけてcygwin1.dllの関数をよんじゃる
とりあえず手始めに「cygwin_conv_to_win32_path」を呼んでみよう
Imports System.Runtime.InteropServices Class Main Public Shared Function cygwin_startup(arg As String) As Integer Console.WriteLine("CygwinStartup EntryPoint") Main() Return 0 End Function Public Shared Function Main() As Integer Console.WriteLine("Main EntryPoint") Dim ret As New System.Text.StringBuilder(260) cygwin_conv_to_win32_path("/usr", ret) Console.WriteLine(ret.ToString) Console.WriteLine("end") Console.ReadKey() End Function <DllImport("cygwin1.dll")> _ Public Shared Sub cygwin_conv_to_win32_path(ByVal path As String, ByVal ret As System.Text.StringBuilder) End Sub End Class
結果、いけた(^-^)
うちのPCでは「C:\data\cygwin」がルートになっとるので↓のような結果
CygwinStartup EntryPoint Main EntryPoint C:\data\cygwin\usr end
が、forkがでけへん!!
いつまでたってもpid=0の子プロセスがはしらへん
子プロセスにsignal送りたいのに〜
っていうか、なんでioctlとかsignal以外に通知する仕組みないねん!!
きみのこっちゃぞ、SIGWINCHめっ!!