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

*1:ソースコードをみるとfork()/vfork()だけコメントアウトされている