sz←"u64" ⋄ ssz←"i64" ⋄ nfds←sz libc_fork ← @ •FFI "i32"‿"fork" libc_pipe ← @ •FFI "i32"‿"pipe"‿">&i32" libc_read ← @ •FFI ssz‿"read"‿"i32"‿"&i8"‿sz libc_write ← @ •FFI ssz‿"write"‿"i32"‿"*i8"‿sz libc_close ← @ •FFI "i32"‿"close"‿">i32" libc_poll ← @ •FFI "i32"‿"poll"‿"&i16"‿nfds‿"i32" Pipe ← { 𝕊: readfd‿writefd ⇐ ⟨c, readfd‿writefd⟩ ← Libc_pipe 0‿0 ! c=0 Write ⇐ {Libc_write ⟨writefd, 𝕩, ≠𝕩⟩} Read ⇐ {n‿b ← Libc_read ⟨readfd, 𝕩⥊0, 𝕩⟩ ⋄ !n≥0 ⋄ n↑b} } BiDiFork ← { 𝕊: p1 ← Pipe@ p2 ← Pipe@ pid ⇐ Libc_fork@ ! pid≥0 parent ⇐ pid=0 CloseWR ← {! ¬∨´ Libc_close¨ {𝕨.writefd‿𝕩.readfd}´ ⌽⍟parent 𝕩} CloseWR p1‿p2 r‿w ⇐ ⌽⍟parent p1‿p2 Read‿readfd ⇐ r Write‿writefd ⇐ w Close ⇐ CloseWR∘p2‿p1 } FFn ← { 𝕊 fn: f ← BiDiFork@ {f.parent? Fn f ⋄ f.Close@ ⋄ •Exit 0; f} } WriteAll ← {p𝕊x: {𝕩-p.Write 𝕩-⊸↑x}•_while_× ≠x} _readAll ← {p E _𝕣 n: ⊑⍟(¬=) {v←p.Read n-≠𝕩 ⋄ 0<≠v? 𝕩∾v;