Path: utzoo!utgpu!news-server.csri.toronto.edu!rpi!zaphod.mps.ohio-state.edu!sol.ctr.columbia.edu!lll-winken!sun-barr!olivea!mintaka!ogicse!pdxgate!jrb@jove.cs.pdx.edu From: jrb@jove.cs.pdx.edu (James Binkley) Newsgroups: comp.unix.programmer Subject: question about dbx and fork(2) Keywords: dbx, fork(), signals Message-ID: <2340@pdxgate.UUCP> Date: 12 Apr 91 15:07:09 GMT Sender: news@pdxgate.UUCP Reply-To: jrb@jove.cs.pdx.edu (James Binkley) Organization: Portland State University, Portland, OR Lines: 86 Can somebody explain why the following happened? Take a look at the dbx session below. The code is listed. This was done on a Sun 4.1 system. The machine is a 68020. I set a breakpoint on main and then "run" to it. I then singlestep past the fork. There is a fork() where the child/inferior loops in an infinite loop. The parent waits. The wait returns 85 as status, meaning the child died courtesy of a SIGTRAP plus a core file was generated. However the breakpoint was on "main" in the parent. I could understand this if the breakpoint had been set in the text of the child. Apparently the child has somehow been awarded the signal anyway. Something to do with virtual memory or??? gdb 3.5 on the same machine does not exhibit the same behavior; i.e., wait() blocks as one would expect. However it does exhibit the same behaviour on a Sequent running Dynix. Jim Binkley jrb@jove.cs.pdx.edu script of dbx session follows: ------------------------------------------ Script started on Thu Apr 11 20:22:48 1991 jove% dbx fork Reading symbolic information... Read 51 symbols (dbx) list 1,35 1 /* 2 * fork.c 3 */ 4 main() 5 { 6 7 int x; 8 int pid, status; 9 10 x = 1; 11 /* parent forks child here 12 */ 13 if ( fork() == 0) { 14 /* set a breakpoint here 15 */ 16 x = 2; 17 printf("child pid is %d\n", getpid()); 18 printf("child %d\n", x); 19 while (x == 2) 20 ; 21 x = x + 1; 22 exit(1); 23 } 24 25 /* parent process waits for child to exit 26 */ 27 pid = wait(&status); 28 29 /* pay attention to what is printed out here 30 */ 31 printf("status %x\n", status); 32 x = x + 1; 33 printf("x %d\n", x); 34 exit(0); 35 } (dbx) stop in main (2) stop in main (dbx) status (2) stop in main (dbx) run Running: fork stopped in main at line 10 in file "fork.c" 10 x = 1; (dbx) s stopped in main at line 13 in file "fork.c" 13 if ( fork() == 0) { (dbx) s stopped in main at line 27 in file "fork.c" 27 pid = wait(&status); (dbx) s stopped in main at line 31 in file "fork.c" 31 printf("status %x\n", status); (dbx) s status 85 (dbx) quit