Use forkpty
(it's non-standard, but the API is very nice, and you can always drop in your own implementation if you don't have it) and exec
the program you want to communicate with in the child process.
Alternatively, if tty semantics aren't to your liking, you could write something like forkpty
but using two pipes, one for each direction of communication, or using socketpair
to communicate with the external program over a unix socket.