1) Writing - check the result of the write. If the other end of the pipe is not open, the number of bytes written will be 0.
2) Not possible but you can have one server fifo for receiving requests. It then generates a pipe name for each client process to connect to and sends it to the client. The client reads the server pipe, closes the server pipe and opens a pipe with the new name given by the server. The server will have to poll all the pipes in separate threads.
3) It is just a write - it can take anything. Just dump the whole object in binary. Note that there should not be any pointers in the object as the pointers will not be pointing to the same address space.