import Foundation public protocol FileHandleReader { var availableData: Data { get } var fileDescriptor: Int32 { get } var pidOfConnectedProcess: Int32 { get } } public protocol FileHandleWriter { func write(_ data: Data) } extension FileHandle: FileHandleReader, FileHandleWriter { public var pidOfConnectedProcess: Int32 { let pidPointer = UnsafeMutableRawPointer.allocate(byteCount: 4, alignment: 1) var len = socklen_t(MemoryLayout.size) getsockopt(fileDescriptor, SOCK_STREAM, LOCAL_PEERPID, pidPointer, &len) return pidPointer.load(as: Int32.self) } }