open Netsys_posix open Printf let s1 = let n1 = sprintf "/s1_%d" (Unix.getpid()) in let s = sem_open n1 [SEM_O_CREAT] 0o666 0 in sem_unlink n1; s let s2 = let n2 = sprintf "/s2_%d" (Unix.getpid()) in let s = sem_open n2 [SEM_O_CREAT] 0o666 0 in sem_unlink n2; s let process1 n = for k = 1 to n do sem_post s1; sem_wait s2 SEM_WAIT_BLOCK done; exit 0 let process2 n = for k = 1 to n do sem_wait s1 SEM_WAIT_BLOCK; sem_post s2 done; exit 0 let main() = let n = int_of_string Sys.argv.(1) in let pid1 = match Unix.fork() with | 0 -> process1 n | pid -> pid in let pid2 = match Unix.fork() with | 0 -> process2 n | pid -> pid in ignore(Unix.waitpid [] pid1); ignore(Unix.waitpid [] pid2) let () = main()