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めっ!!