Problem 1 is caused because you are probably overriding the default SIGHUP signal. When a parent process dies, the child process recieves SIGHUP; the default SIGHUP handler calls exit, but if you override it before the fork, then it will stay overridden, and thus you will not die when your parent exits. If you really need SIGHUP to stay overridden in the parent (I can't see why, but you must have a reason), then after the fork you should call "signal(SIGHUP, SIG_DFL)" to return to the standard behavior.
Problem 2 I will leave up to somebody else, since I don't have the gnugo code handy. :-)
PROBLEM 1: It doesn't kill the gnugo process when it exits. (Run it a few times then ask yourself where all your memory went.) What's the right way to do this?
PROBLEM 2: It hangs when called from twogtp. I can't figure out why.