I once had the same question. This is what I eventually came up with (I didn't want to associate C):
let cpu_count () =
try match Sys.os_type with
| "Win32" -> int_of_string (Sys.getenv "NUMBER_OF_PROCESSORS")
| _ ->
let i = Unix.open_process_in "getconf _NPROCESSORS_ONLN" in
let close () = ignore (Unix.close_process_in i) in
try Scanf.fscanf i "%d" (fun n -> close (); n) with e -> close (); raise e
with
| Not_found | Sys_error _ | Failure _ | Scanf.Scan_failure _
| End_of_file | Unix.Unix_error (_, _, _) -> 1
Unix, open_process_in Sys.command . linux osx, , mingw, cygwin .
. , freebsd, , ,
sysctl -n hw.ncpu. , Sys.os_type , uname -s, Sys.os_type Win32.