garvey@cmic.UUCP (Joe Garvey) (02/17/90)
I'm having a devil of a time with the following scrap of code. It will fork the child correctly, do all the I/O fine. It's just that the wait from the parent is never statisfied. The child becomes a zombie process, and won't go away until the parent is killed. All suggestions greatly appreciated. E-mail preferred. PS. I neglected to mention this program works like nice and nohup. The child program is based on the arguments to the parent command. The name of my program is "backcon". nohup sleep 10 #yes I know this is dumb, aren't all trivial examples? :-) nice sleep 10 backcon sleep 10 #example 1 backcon rm testfile #example 2 PPS. I'm running HP-UX 6.5 on a HP9000/370. It's a SYSV system with lotsa BSD features (like the fast file system). Peoples Exhibit #1: The Offending segment of code. Mstr_Pty_fd = Open_Pty_Master(Slv_Pty_Name); if ((Child_Pid = fork()) < 0) then /* trap out a failed fork */ { exit(FORK_FAILED); } end_if if (Child_Pid == 0) /* child */ { setpgrp(); /* start a new terminal process group */ Slv_Pty_fd = Open_Pty_Slave(Slv_Pty_Name); close(Mstr_Pty_fd); /* don't need master side file descriptor */ close(0); /* close stdin, stdout, and stderr since they go to old tty */ close(1); close(2); dup(Slv_Pty_fd); /* open new stdin, stdout, stderr to new tty */ dup(Slv_Pty_fd); dup(Slv_Pty_fd); close(Slv_Pty_fd); /* don't need any more, got stdin, stderr, stdout */ /* child becomes user program from command line */ execvp(ArgV[Cmd_Line.Child_Program], ArgV+Cmd_Line.Child_Program); } else /* parent */ { wait(NULL); } /* end_if */ -- Peoples Exhibit #2: Author of Offending Segment of Code. Joe Garvey UUCP: {apple,backbone}!versatc!mips!cmic!garvey California Microwave Internet: garvey%cmic@mips.com 990 Almanor Ave HP Desk: garvey (cmic@mips.com) /hp1900/ux Sunnyvale, Ca, 94086 800-831-3104 (outside CA) 408-720-6439 (let it ring) 800-824-7814 (inside CA)