| pipe1 pipe2 procA procB semaA semaB | OSProcess accessor canAccessSystem ifFalse: [^self]. pipe1 := OSPipe nonBlockingPipe. pipe2 := OSPipe nonBlockingPipe. procA := UnixProcess forkJob: 'a' arguments: nil environment: nil descriptors: {pipe1 reader. pipe2 writer. nil}. procB := UnixProcess forkJob: 'b' arguments: nil environment: nil descriptors: {pipe2 reader. pipe1 writer. nil}. semaA := Semaphore new. semaB := Semaphore new. [[Processor yield. procA isComplete] whileFalse. procB sigterm. semaA signal] fork. [[Processor yield. procB isComplete] whileFalse. procA sigterm. semaB signal] fork. semaA wait. semaB wait. pipe1 close. pipe2 close