MonoでCのstdioを呼び出してみる
MonoはMono.Posixアセンブリを使うとPOSIXの関数を呼び出せるようだ。
そこでCのstdioを使ってcat(1) を実装してみた。
// $ mcs -r:Mono.Posix Cat.cs using System; using Mono.Unix.Native; public class Cat { public static void Main(string[] argv) { foreach (var file in argv) { var fp = Stdlib.fopen(file, "r"); Int32 c; while ( (c = Stdlib.fgetc(fp)) != Stdlib.EOF ) { Stdlib.putchar(c); } Stdlib.fclose(fp); } } }
Stdlib.fopen()
の戻り値が IntPtr だったりといろいろ不都合はあるものの、呼び出すことができた。
他、malloc()なども含めてCの関数はほぼそのまま呼べる。fread()/fwrite()などもByte[]を介して使える。ただし fork() はプロセス終了処理に不都合があるらしく使うことができない*1。