zsh-workers
 help / color / mirror / code / Atom feed
* Re: fg/bg on FreeBSD.
@ 2000-05-08  8:48 Sven Wischnowsky
  2000-05-08  9:17 ` Tanaka Akira
  0 siblings, 1 reply; 10+ messages in thread
From: Sven Wischnowsky @ 2000-05-08  8:48 UTC (permalink / raw)
  To: zsh-workers


Tanaka Akira wrote:

> In article <1000506212352.ZM8935@candle.brasslantern.com>,
>   "Bart Schaefer" <schaefer@candle.brasslantern.com> writes:
> 
> > What happens if you reverse the order of the test?
> > 
> >           if (setpgrp(0L, jobtab[list_pipe_job].gleader) == -1 ||
> > 	      killpg(jobtab[list_pipe_job].gleader, 0) == -1) {
> 
> Wow!  It's good idea.

Indeed. Why no patch for this? In other words: have I missed something?


Bye
 Sven


--
Sven Wischnowsky                         wischnow@informatik.hu-berlin.de


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: fg/bg on FreeBSD.
  2000-05-08  8:48 fg/bg on FreeBSD Sven Wischnowsky
@ 2000-05-08  9:17 ` Tanaka Akira
  0 siblings, 0 replies; 10+ messages in thread
From: Tanaka Akira @ 2000-05-08  9:17 UTC (permalink / raw)
  To: zsh-workers

In article <200005080848.KAA12669@beta.informatik.hu-berlin.de>,
  Sven Wischnowsky <wischnow@informatik.hu-berlin.de> writes:

> > >           if (setpgrp(0L, jobtab[list_pipe_job].gleader) == -1 ||
> > > 	      killpg(jobtab[list_pipe_job].gleader, 0) == -1) {
> > 
> > Wow!  It's good idea.
> 
> Indeed. Why no patch for this? In other words: have I missed something?

OK.  This is the patch.  (I'll commit this.)

Index: Src/exec.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/exec.c,v
retrieving revision 1.7
diff -u -r1.7 exec.c
--- Src/exec.c	2000/05/04 13:40:05	1.7
+++ Src/exec.c	2000/05/08 09:15:31
@@ -2466,8 +2466,8 @@
 	}
     } else if (thisjob != -1 && cl) {
 	if (jobtab[list_pipe_job].gleader && (list_pipe || list_pipe_child)) {
-	    if (killpg(jobtab[list_pipe_job].gleader, 0) == -1 ||
-		setpgrp(0L, jobtab[list_pipe_job].gleader) == -1) {
+	    if (setpgrp(0L, jobtab[list_pipe_job].gleader) == -1 ||
+		killpg(jobtab[list_pipe_job].gleader, 0) == -1) {
 		jobtab[list_pipe_job].gleader =
 		    jobtab[thisjob].gleader = (list_pipe_child ? mypgrp : getpid());
 		setpgrp(0L, jobtab[list_pipe_job].gleader);
-- 
Tanaka Akira


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: fg/bg on FreeBSD.
  2000-05-06 21:23       ` Bart Schaefer
@ 2000-05-06 21:41         ` Tanaka Akira
  0 siblings, 0 replies; 10+ messages in thread
From: Tanaka Akira @ 2000-05-06 21:41 UTC (permalink / raw)
  To: zsh-workers

In article <1000506212352.ZM8935@candle.brasslantern.com>,
  "Bart Schaefer" <schaefer@candle.brasslantern.com> writes:

> What happens if you reverse the order of the test?
> 
>           if (setpgrp(0L, jobtab[list_pipe_job].gleader) == -1 ||
> 	      killpg(jobtab[list_pipe_job].gleader, 0) == -1) {

Wow!  It's good idea.

| Z:akr@dhcp21% ktrace -i Src/zsh -f 
| dhcp21% echo|sleep 100
| ^Z
| zsh: done       echo | 
| zsh: suspended  sleep 100
| dhcp21% jobs -l
| [1]  + 50065 done       echo | 
|        50066 suspended  sleep 100
| dhcp21% ps j50066
| USER   PID  PPID  PGID   SESS JOBC STAT  TT       TIME COMMAND
| akr  50066 50064 50065 97d1c0    1 T     p0    0:00.00 sleep 100
| dhcp21% bg
| [1]  + done       echo | 
|        continued  sleep 100
| dhcp21% ps j50066
| USER   PID  PPID  PGID   SESS JOBC STAT  TT       TIME COMMAND
| akr  50066 50064 50065 97d1c0    1 S     p0    0:00.00 sleep 100

It's resumed successfully.

| dhcp21% 
| [1]  + done       echo | sleep 100
| dhcp21% exit

> What I'm trying to discover is whether killpg() continues to fail after
> a process is successfully added to the group.

| Z:akr@dhcp21% kdump|egrep 'kill|fork|exit|setpgid|wait'
|  50064 zsh      CALL  fork
|  50064 zsh      RET   fork 50065/0xc391
|  50065 zsh      RET   fork 0
|  50065 zsh      CALL  setpgid(0,0xc391)
|  50065 zsh      RET   setpgid 0
|  50064 zsh      CALL  fork
|  50064 zsh      RET   fork 50066/0xc392
|  50065 zsh      CALL  exit(0)

Now, echo is zombie.

|  50066 zsh      RET   fork 0
|  50066 zsh      CALL  setpgid(0,0xc391)
|  50066 zsh      RET   setpgid 0

sleep comes into the group successfully.

|  50066 zsh      CALL  kill(0xffff3c6f,0)
|  50066 zsh      RET   kill 0

killpg succeeds.

|  50064 zsh      CALL  wait4(0xffffffff,0xbfbff530,0x3,0)
|  50064 zsh      RET   wait4 50065/0xc391
|  50064 zsh      CALL  wait4(0xffffffff,0xbfbff530,0x3,0)
|  50064 zsh      RET   wait4 0
|  50064 zsh      CALL  wait4(0xffffffff,0xbfbff530,0x3,0)
|  50064 zsh      RET   wait4 50066/0xc392

echo is waited.

|  50064 zsh      CALL  wait4(0xffffffff,0xbfbff530,0x3,0)
|  50064 zsh      RET   wait4 0
|  50064 zsh      CALL  fork
|  50064 zsh      RET   fork 50067/0xc393
|  50067 zsh      RET   fork 0
|  50067 zsh      CALL  setpgid(0,0xc393)
|  50067 zsh      RET   setpgid 0
|  50067 ps       CALL  exit(0)
|  50064 zsh      CALL  wait4(0xffffffff,0xbfbff530,0x3,0)
|  50064 zsh      RET   wait4 50067/0xc393
|  50064 zsh      CALL  kill(0xfffe7960,0)
|  50064 zsh      RET   kill -1 errno 3 No such process
|  50064 zsh      CALL  wait4(0xffffffff,0xbfbff530,0x3,0)
|  50064 zsh      RET   wait4 0
|  50064 zsh      CALL  kill(0xffff3c6f,0x13)
|  50064 zsh      RET   kill 0
|  50064 zsh      CALL  fork
|  50064 zsh      RET   fork 50071/0xc397
|  50071 zsh      RET   fork 0
|  50071 zsh      CALL  setpgid(0,0xc397)
|  50071 zsh      RET   setpgid 0
|  50071 ps       CALL  exit(0)
|  50064 zsh      CALL  wait4(0xffffffff,0xbfbff530,0x3,0)
|  50064 zsh      RET   wait4 50071/0xc397
|  50064 zsh      CALL  kill(0xfffe7960,0)
|  50064 zsh      RET   kill -1 errno 3 No such process
|  50064 zsh      CALL  wait4(0xffffffff,0xbfbff530,0x3,0)
|  50064 zsh      RET   wait4 0
|  50064 zsh      CALL  kill(0xffff3c6f,0xf)
|  50064 zsh      RET   kill 0
|  50064 zsh      CALL  wait4(0xffffffff,0xbfbff5c0,0x3,0)
|  50064 zsh      RET   wait4 50066/0xc392
|  50064 zsh      CALL  wait4(0xffffffff,0xbfbff5c0,0x3,0)
|  50064 zsh      RET   wait4 -1 errno 10 No child processes
|  50064 zsh      CALL  exit(0)
-- 
Tanaka Akira


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: fg/bg on FreeBSD.
  2000-05-06 19:58     ` Tanaka Akira
@ 2000-05-06 21:23       ` Bart Schaefer
  2000-05-06 21:41         ` Tanaka Akira
  0 siblings, 1 reply; 10+ messages in thread
From: Bart Schaefer @ 2000-05-06 21:23 UTC (permalink / raw)
  To: Tanaka Akira, zsh-workers

On May 7,  4:58am, Tanaka Akira wrote:
} Subject: Re: fg/bg on FreeBSD.
}
} In article <hvozoq3mux1.fsf@serein.m17n.org>,
}   Tanaka Akira <akr@m17n.org> writes:
} 
} > Possibly.  But NetBSD has no problem...
} 
} I found the difference between FreeBSD and NetBSD.
} 
} FreeBSD fails to kill(-PGID,0) for zombie process but NetBSD (and
} Linux) succeeds.
} 
[...]
} 
} I confirmed following modification prevents the problem.  But
} definitely this is too radical...
} 
} Index: Src/exec.c
} ===================================================================
} -           if (killpg(jobtab[list_pipe_job].gleader, 0) == -1 ||
} +           if (/* killpg(jobtab[list_pipe_job].gleader, 0) == -1 || */
}                 setpgrp(0L, jobtab[list_pipe_job].gleader) == -1) {

What happens if you reverse the order of the test?

          if (setpgrp(0L, jobtab[list_pipe_job].gleader) == -1 ||
	      killpg(jobtab[list_pipe_job].gleader, 0) == -1) {

What I'm trying to discover is whether killpg() continues to fail after
a process is successfully added to the group.

-- 
Bart Schaefer                                 Brass Lantern Enterprises
http://www.well.com/user/barts              http://www.brasslantern.com


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: fg/bg on FreeBSD.
  2000-05-06 17:48   ` Tanaka Akira
  2000-05-06 18:45     ` Bart Schaefer
@ 2000-05-06 19:58     ` Tanaka Akira
  2000-05-06 21:23       ` Bart Schaefer
  1 sibling, 1 reply; 10+ messages in thread
From: Tanaka Akira @ 2000-05-06 19:58 UTC (permalink / raw)
  To: zsh-workers

In article <hvozoq3mux1.fsf@serein.m17n.org>,
  Tanaka Akira <akr@m17n.org> writes:

> Possibly.  But NetBSD has no problem...

I found the difference between FreeBSD and NetBSD.

FreeBSD fails to kill(-PGID,0) for zombie process but NetBSD (and
Linux) succeeds.

FreeBSD:

> | Z:akr@dhcp21% kdump|egrep 'kill|fork|exit|setpgid'
> |  29256 zsh      CALL  fork                    # zsh: fork for echo
> |  29256 zsh      RET   fork 29257/0x7249
> |  29257 zsh      RET   fork 0
> |  29257 zsh      CALL  setpgid(0,0x7249)       # echo: setpgid(0,29257)
> |  29257 zsh      RET   setpgid 0
> |  29256 zsh      CALL  fork                    # zsh: fork for sleep
> |  29256 zsh      RET   fork 29258/0x724a
> |  29257 zsh      CALL  exit(0)                 # echo: exit(0)

29257(echo) is zombie now.

> |  29258 zsh      RET   fork 0

> |  29258 zsh      CALL  kill(0xffff8db7,0)
> |  29258 zsh      RET   kill -1 errno 3 No such process

The process to be sleep command tries to check a leader is exists...
0xffff8db7 is -29257.  kill(-29257,0) is failed.

> |  29258 zsh      CALL  setpgid(0,0x724a)       # sleep: setpgid(0,29258)
> |  29258 zsh      RET   setpgid 0

So, it decides to be a leader itself.

NetBSD:

> | Z:akr@netbsd% kdump|egrep 'kill|fork|exit|setpgid'
> |  16519 zsh      CALL  fork                    # zsh: fork for echo
> |  16519 zsh      RET   fork 16520/0x4088
> |  16520 zsh      RET   fork 0
> |  16520 zsh      CALL  setpgid(0,0x4088)
> |  16520 zsh      RET   setpgid 0
> |  16520 zsh      CALL  exit(0)                 # echo: exit(0)

16520(echo) is zombie now.

> |  16519 zsh      CALL  fork                    # zsh: fork for sleep
> |  16519 zsh      RET   fork 16521/0x4089
> |  16521 zsh      RET   fork 0
> |  16521 zsh      CALL  kill(0xffffbf78,0)
> |  16521 zsh      RET   kill 0

The process to be sleep command tries to check a leader is exists...
0xffffbf78 is -16520.  kill(-16520,0) is succeed.

> |  16521 zsh      CALL  setpgid(0,0x4088)       # sleep: setpgid(0,16520)
> |  16521 zsh      RET   setpgid 0

So, it comes into the process group of echo.

I confirmed following modification prevents the problem.  But
definitely this is too radical...

Index: Src/exec.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/exec.c,v
retrieving revision 1.7
diff -u -r1.7 exec.c
--- Src/exec.c  2000/05/04 13:40:05     1.7
+++ Src/exec.c  2000/05/06 19:53:20
@@ -2466,7 +2466,7 @@
        }
     } else if (thisjob != -1 && cl) {
        if (jobtab[list_pipe_job].gleader && (list_pipe || list_pipe_child)) {
-           if (killpg(jobtab[list_pipe_job].gleader, 0) == -1 ||
+           if (/* killpg(jobtab[list_pipe_job].gleader, 0) == -1 || */
                setpgrp(0L, jobtab[list_pipe_job].gleader) == -1) {
                jobtab[list_pipe_job].gleader =
                    jobtab[thisjob].gleader = (list_pipe_child ? mypgrp : getpid());
-- 
Tanaka Akira


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: fg/bg on FreeBSD.
  2000-05-06 18:45     ` Bart Schaefer
@ 2000-05-06 19:03       ` Tanaka Akira
  0 siblings, 0 replies; 10+ messages in thread
From: Tanaka Akira @ 2000-05-06 19:03 UTC (permalink / raw)
  To: zsh-workers

In article <1000506184503.ZM6391@candle.brasslantern.com>,
  "Bart Schaefer" <schaefer@candle.brasslantern.com> writes:

> OK, now, can you "fg" it, wait for the first sleep (but not the second)
> to exit, then ^Z again and check the PGIDs?

| Z:akr@dhcp21% ktrace -i zsh -f
| dhcp21% sleep 30|sleep 100
| ^Z
| zsh: suspended  sleep 30 | sleep 100
| dhcp21% jobs -l
| [1]  + 29347 suspended  sleep 30 | 
|        29348 suspended  sleep 100
| dhcp21% ps j   
| USER   PID  PPID  PGID   SESS JOBC STAT  TT       TIME COMMAND
| akr  29335 29333 29335 a0fe80    0 Is    p0    0:00.11 /home/akr/.zsh/arch/i386-unknown-freebsd4.0/bin/zsh -l
| akr  29346 29335 29346 a0fe80    1 S     p0    0:00.07 zsh -f
| akr  29347 29346 29347 a0fe80    2 T     p0    0:00.00 sleep 30
| akr  29348 29346 29347 a0fe80    2 T     p0    0:00.00 sleep 100
| akr  29349 29346 29349 a0fe80    1 R+    p0    0:00.00 ps j

PGID of `sleep 100' is both 29347.  No problem.

| dhcp21% fg
| [1]  + continued  sleep 30 | sleep 100
| ^Z
| zsh: done       sleep 30 | 
| zsh: suspended  sleep 100
| dhcp21% ps j
| USER   PID  PPID  PGID   SESS JOBC STAT  TT       TIME COMMAND
| akr  29335 29333 29335 a0fe80    0 Is    p0    0:00.11 /home/akr/.zsh/arch/i386-unknown-freebsd4.0/bin/zsh -l
| akr  29346 29335 29346 a0fe80    1 S     p0    0:00.08 zsh -f
| akr  29348 29346 29347 a0fe80    1 T     p0    0:00.00 sleep 100
| akr  29365 29346 29365 a0fe80    1 R+    p0    0:00.00 ps j
| akr  29352 29350 29352 9099c0    0 Ss+   p1    0:00.12 /home/akr/.zsh/arch/i386-unknown-freebsd4.0/bin/zsh -l
| dhcp21% 

The PGID is not changed: 29347.

> Another test to try:
> 
> 	echo | sleep 100 | sleep 200
> 
> If you ^Z this, do both sleeps get the same PGID, or do they each become
> their own process group?  (I'm hoping the latter, for sanity, otherwise
> it's a guessing game as to what PID becomes the leader.)

Wow!  This cannot stop with ^Z.

| Z:akr@dhcp21% zsh -f
| dhcp21% echo $$
| 29385
| dhcp21% tty
| /dev/ttyp0
| dhcp21% echo | sleep 100 | sleep 200
| ^Z

`ps j' from another termianl before ^Z:

| Z:akr@dhcp21% ps j         
| USER   PID  PPID  PGID   SESS JOBC STAT  TT       TIME COMMAND
| akr  29335 29333 29335 a0fe80    0 Ss    p0    0:00.12 /home/akr/.zsh/arch/i386
| akr  29385 29335 29385 a0fe80    1 S     p0    0:00.03 zsh -f
| akr  29388 29385 29388 a0fe80    1 S     p0    0:00.00 sleep 100
| akr  29389 29385 29389 a0fe80    1 S+    p0    0:00.00 sleep 200
| akr  29352 29350 29352 9099c0    0 Ss    p1    0:00.14 /home/akr/.zsh/arch/i386
| akr  29390 29352 29390 9099c0    1 R+    p1    0:00.00 ps j

Hm.  Two sleep commands has own PGID.  They are both process group leader.

`ps j' from another termianl after ^Z:

| Z:akr@dhcp21% ps j
| USER   PID  PPID  PGID   SESS JOBC STAT  TT       TIME COMMAND
| akr  29335 29333 29335 a0fe80    0 Is    p0    0:00.12 /home/akr/.zsh/arch/i386
| akr  29385 29335 29385 a0fe80    1 S     p0    0:00.03 zsh -f
| akr  29388 29385 29388 a0fe80    1 S     p0    0:00.00 sleep 100
| akr  29389 29385 29389 a0fe80    1 T+    p0    0:00.00 sleep 200
| akr  29352 29350 29352 9099c0    0 Ss    p1    0:00.14 /home/akr/.zsh/arch/i386
| akr  29391 29352 29391 9099c0    1 R+    p1    0:00.00 ps j

Only `sleep 200' is stopped because foreground process group for ttyp0
is 29389.  Maybe.
-- 
Tanaka Akira


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: fg/bg on FreeBSD.
  2000-05-06 17:48   ` Tanaka Akira
@ 2000-05-06 18:45     ` Bart Schaefer
  2000-05-06 19:03       ` Tanaka Akira
  2000-05-06 19:58     ` Tanaka Akira
  1 sibling, 1 reply; 10+ messages in thread
From: Bart Schaefer @ 2000-05-06 18:45 UTC (permalink / raw)
  To: Tanaka Akira, zsh-workers

On May 7,  2:48am, Tanaka Akira wrote:
} Subject: Re: fg/bg on FreeBSD.
}
} In article <1000506170828.ZM2063@candle.brasslantern.com>,
}   "Bart Schaefer" <schaefer@candle.brasslantern.com> writes:
} 
} > Why is the PGID of sleep different on FreeBSD?  Did it change after the
} > sleep was started because the echo exited?
} 
} Possibly.  But NetBSD has no problem...

Yes, what I'm wondering is whether this is a FreeBSD bug.
 
} | Z:akr@dhcp21% ktrace -i zsh -f
} | dhcp21% sleep 100|sleep 200
} | ^Z
} | zsh: suspended  sleep 100 | sleep 200
} | dhcp21% jobs -l
} | [1]  + 29245 suspended  sleep 100 | 
} |        29246 suspended  sleep 200
} | dhcp21% ps j29245; ps j29246 
} | USER   PID  PPID  PGID   SESS JOBC STAT  TT       TIME COMMAND
} | akr  29245 29244 29245 94d480    2 T     p3    0:00.00 sleep 100
} | USER   PID  PPID  PGID   SESS JOBC STAT  TT       TIME COMMAND
} | akr  29246 29244 29245 94d480    2 T     p3    0:00.00 sleep 200
} 
} PGID is first sleep's PID.  It's good.
} 
} | dhcp21% bg
} | [1]  + continued  sleep 100 | sleep 200
} | dhcp21% ps j29245; ps j29246 
} | USER   PID  PPID  PGID   SESS JOBC STAT  TT       TIME COMMAND
} | akr  29245 29244 29245 94d480    2 I     p3    0:00.00 sleep 100
} | USER   PID  PPID  PGID   SESS JOBC STAT  TT       TIME COMMAND
} | akr  29246 29244 29245 94d480    2 I     p3    0:00.00 sleep 200
} 
} It's successfully resumed.

OK, now, can you "fg" it, wait for the first sleep (but not the second)
to exit, then ^Z again and check the PGIDs?

If the PGID is going to change every time the group leader exits, then
we've got a problem -- we can't simply record the group leader's PID and
keep using it unless we arrange for a group leader that's guaranteed to
stay alive for the whole pipeline.

Another test to try:

	echo | sleep 100 | sleep 200

If you ^Z this, do both sleeps get the same PGID, or do they each become
their own process group?  (I'm hoping the latter, for sanity, otherwise
it's a guessing game as to what PID becomes the leader.)

-- 
Bart Schaefer                                 Brass Lantern Enterprises
http://www.well.com/user/barts              http://www.brasslantern.com


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: fg/bg on FreeBSD.
  2000-05-06 17:08 ` Bart Schaefer
@ 2000-05-06 17:48   ` Tanaka Akira
  2000-05-06 18:45     ` Bart Schaefer
  2000-05-06 19:58     ` Tanaka Akira
  0 siblings, 2 replies; 10+ messages in thread
From: Tanaka Akira @ 2000-05-06 17:48 UTC (permalink / raw)
  To: zsh-workers

In article <1000506170828.ZM2063@candle.brasslantern.com>,
  "Bart Schaefer" <schaefer@candle.brasslantern.com> writes:

> Why is the PGID of sleep different on FreeBSD?  Did it change after the
> sleep was started because the echo exited?

Possibly.  But NetBSD has no problem...

| Z:akr@dhcp21% ktrace -i zsh -f              
| dhcp21% echo|sleep 10
| ^Z
| zsh: done       echo | 
| zsh: suspended  sleep 10
| dhcp21% jobs -l
| [1]  + 29257 done       echo | 
|        29258 suspended  sleep 10
| dhcp21% ps j29258
| USER   PID  PPID  PGID   SESS JOBC STAT  TT       TIME COMMAND
| akr  29258 29256 29258 94d480    1 T     p3    0:00.00 sleep 10
| dhcp21% bg
| [1]  + done       echo | 
|        continued  sleep 10
| dhcp21% ps j29258
| USER   PID  PPID  PGID   SESS JOBC STAT  TT       TIME COMMAND
| akr  29258 29256 29258 94d480    1 T     p3    0:00.00 sleep 10
| dhcp21% kill -9 29258
| [1]  + done       echo | 
|        killed     sleep 10
| dhcp21% exit
| Z:akr@dhcp21% kdump|egrep 'kill|fork|exit|setpgid'
|  29256 zsh      CALL  fork                    # zsh: fork for echo
|  29256 zsh      RET   fork 29257/0x7249
|  29257 zsh      RET   fork 0
|  29257 zsh      CALL  setpgid(0,0x7249)       # echo: setpgid(0,29257)
|  29257 zsh      RET   setpgid 0
|  29256 zsh      CALL  fork                    # zsh: fork for sleep
|  29256 zsh      RET   fork 29258/0x724a
|  29257 zsh      CALL  exit(0)                 # echo: exit(0)
|  29258 zsh      RET   fork 0
|  29258 zsh      CALL  kill(0xffff8db7,0)
|  29258 zsh      RET   kill -1 errno 3 No such process
|  29258 zsh      CALL  setpgid(0,0x724a)       # sleep: setpgid(0,29258)

Hm.  The process to be sleep command set its PGID itself.

|  29258 zsh      RET   setpgid 0
|  29256 zsh      CALL  kill(0xffff8db6,0)
|  29256 zsh      RET   kill 0
|  29256 zsh      CALL  fork                    # zsh: fork for ps
|  29256 zsh      RET   fork 29259/0x724b
|  29259 zsh      RET   fork 0
|  29259 zsh      CALL  setpgid(0,0x724b)
|  29259 zsh      RET   setpgid 0
|  29259 ps       CALL  exit(0)
|  29256 zsh      CALL  kill(0xfffe7960,0)
|  29256 zsh      RET   kill -1 errno 3 No such process
|  29256 zsh      CALL  kill(0xffff8db7,0x13)   # zsh: kill(-29257,SIGCONT)
|  29256 zsh      RET   kill -1 errno 3 No such process
|  29256 zsh      CALL  fork                    # zsh: fork for ps
|  29256 zsh      RET   fork 29260/0x724c
|  29260 zsh      RET   fork 0
|  29260 zsh      CALL  setpgid(0,0x724c)
|  29260 zsh      RET   setpgid 0
|  29260 ps       CALL  exit(0)
|  29256 zsh      CALL  kill(0xfffe7960,0)
|  29256 zsh      RET   kill -1 errno 3 No such process
|  29256 zsh      CALL  kill(0x724a,0x9)
|  29256 zsh      RET   kill 0
|                killed     sleep 10
|  29256 zsh      CALL  exit(0)
| Z:akr@dhcp21% 

> Please try the same test, but replace "echo" with "sleep 9" so that you
> can stop both jobs before either one of them exits.  Then see what the
> PGID of the second sleep is.

OK.

| Z:akr@dhcp21% ktrace -i zsh -f
| dhcp21% sleep 100|sleep 200
| ^Z
| zsh: suspended  sleep 100 | sleep 200

9 seconds are too short to check it...

| dhcp21% jobs -l
| [1]  + 29245 suspended  sleep 100 | 
|        29246 suspended  sleep 200
| dhcp21% ps j29245; ps j29246 
| USER   PID  PPID  PGID   SESS JOBC STAT  TT       TIME COMMAND
| akr  29245 29244 29245 94d480    2 T     p3    0:00.00 sleep 100
| USER   PID  PPID  PGID   SESS JOBC STAT  TT       TIME COMMAND
| akr  29246 29244 29245 94d480    2 T     p3    0:00.00 sleep 200

PGID is first sleep's PID.  It's good.

| dhcp21% bg
| [1]  + continued  sleep 100 | sleep 200
| dhcp21% ps j29245; ps j29246 
| USER   PID  PPID  PGID   SESS JOBC STAT  TT       TIME COMMAND
| akr  29245 29244 29245 94d480    2 I     p3    0:00.00 sleep 100
| USER   PID  PPID  PGID   SESS JOBC STAT  TT       TIME COMMAND
| akr  29246 29244 29245 94d480    2 I     p3    0:00.00 sleep 200

It's successfully resumed.

| dhcp21% kill %1
| [1]  + terminated  sleep 100 | sleep 200
| dhcp21% exit
| Z:akr@dhcp21% 

Note that this is the result of similar test on NetBSD.

| Z:akr@netbsd% ktrace -i zsh -f
| netbsd% echo|sleep 100
| ^Z
| zsh: done       echo | 
| zsh: suspended  sleep 100
| netbsd% jobs -l
| [1]  + 16520 done       echo | 
|        16521 suspended  sleep 100
| netbsd% ps j16521
| USER       PID  PPID  PGID   SESS JOBC STAT TT       TIME COMMAND
| akr      16521 16519 16520 c09fae40    1 T    p1    0:00.01 sleep 100 
| netbsd% bg
| [1]  + done       echo | 
|        continued  sleep 100
| netbsd% ps j16521
| USER       PID  PPID  PGID   SESS JOBC STAT TT       TIME COMMAND
| akr      16521 16519 16520 c09fae40    1 S    p1    0:00.01 sleep 100 
| netbsd% kill %1
| [1]  + done        echo | 
|        terminated  sleep 100
| netbsd% exit
| Z:akr@netbsd% kdump|egrep 'kill|fork|exit|setpgid'
|  16519 zsh      CALL  fork                    # zsh: fork for echo
|  16519 zsh      RET   fork 16520/0x4088
|  16520 zsh      RET   fork 0
|  16520 zsh      CALL  setpgid(0,0x4088)
|  16520 zsh      RET   setpgid 0
|  16520 zsh      CALL  exit(0)                 # echo: exit(0)
|  16519 zsh      CALL  fork                    # zsh: fork for sleep
|  16519 zsh      RET   fork 16521/0x4089
|  16521 zsh      RET   fork 0
|  16521 zsh      CALL  kill(0xffffbf78,0)
|  16521 zsh      RET   kill 0
|  16521 zsh      CALL  setpgid(0,0x4088)       # sleep: setpgid(0,16520)

It setpgid itself to 16520(echo's PID) correctly.

|  16521 zsh      RET   setpgid 0
|  16519 zsh      CALL  fork
|  16519 zsh      RET   fork 16522/0x408a
|  16522 zsh      RET   fork 0
|  16522 zsh      CALL  setpgid(0,0x408a)
|  16522 zsh      RET   setpgid 0
|  16519 zsh      CALL  kill(0xffff8acf,0)
|  16519 zsh      RET   kill -1 errno 3 No such process
|  16519 zsh      CALL  kill(0xffffbf78,0x13)
|  16519 zsh      RET   kill 0
|  16519 zsh      CALL  fork
|  16519 zsh      RET   fork 16523/0x408b
|  16523 zsh      RET   fork 0
|  16523 zsh      CALL  setpgid(0,0x408b)
|  16523 zsh      RET   setpgid 0
|  16519 zsh      CALL  kill(0xffff8acf,0)
|  16519 zsh      RET   kill -1 errno 3 No such process
|  16519 zsh      CALL  kill(0xffffbf78,0xf)
|  16519 zsh      RET   kill 0
|  16519 zsh      CALL  exit(0)
| Z:akr@netbsd% 
-- 
Tanaka Akira


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: fg/bg on FreeBSD.
  2000-05-06 15:03 Tanaka Akira
@ 2000-05-06 17:08 ` Bart Schaefer
  2000-05-06 17:48   ` Tanaka Akira
  0 siblings, 1 reply; 10+ messages in thread
From: Bart Schaefer @ 2000-05-06 17:08 UTC (permalink / raw)
  To: zsh-workers

On May 7, 12:03am, Tanaka Akira wrote:
} Subject: fg/bg on FreeBSD.
}
} On FreeBSD 3.4 and 4.0, fg/bg may not activate suspended process.
} 
} Report the job info.
} echo's PID is 754 and it's already done.
} sleep's PID is 755 and it's suspended.
} 
} | dhcp21% ps j755
} | USER   PID  PPID  PGID   SESS JOBC STAT  TT       TIME COMMAND
} | akr    755   753   755 92fdc0    1 T     p1    0:00.00 sleep 10

Here's the same on linux:

zagzig[22] jobs -l
[1]  + 2052 done       echo | 
       2053 suspended  sleep 10
zagzig[23] ps j2053
 PPID   PID  PGID   SID TTY TPGID  STAT  UID   TIME COMMAND
 2013  2053  2052  2013  pc  2054  T     674   0:00 sleep 10 

Why is the PGID of sleep different on FreeBSD?  Did it change after the
sleep was started because the echo exited?

Please try the same test, but replace "echo" with "sleep 9" so that you
can stop both jobs before either one of them exits.  Then see what the
PGID of the second sleep is.

-- 
Bart Schaefer                                 Brass Lantern Enterprises
http://www.well.com/user/barts              http://www.brasslantern.com


^ permalink raw reply	[flat|nested] 10+ messages in thread

* fg/bg on FreeBSD.
@ 2000-05-06 15:03 Tanaka Akira
  2000-05-06 17:08 ` Bart Schaefer
  0 siblings, 1 reply; 10+ messages in thread
From: Tanaka Akira @ 2000-05-06 15:03 UTC (permalink / raw)
  To: zsh-workers

On FreeBSD 3.4 and 4.0, fg/bg may not activate suspended process.

| Z:akr@dhcp21% ktrace zsh -f

Start zsh with kernel trace.

| dhcp21% echo|sleep 10
| ^Z
| zsh: done       echo | 
| zsh: suspended  sleep 10

Start `echo|sleep 10' and immediately suspend it by <C-z>.

| dhcp21% jobs -l
| [1]  + 754 done       echo | 
|        755 suspended  sleep 10

Report the job info.
echo's PID is 754 and it's already done.
sleep's PID is 755 and it's suspended.

| dhcp21% ps j755
| USER   PID  PPID  PGID   SESS JOBC STAT  TT       TIME COMMAND
| akr    755   753   755 92fdc0    1 T     p1    0:00.00 sleep 10

Check the process status by ps.
`T' on `STAT' field shows that it's stopped.

| dhcp21% bg
| [1]  + done       echo | 
|        continued  sleep 10

Resume the job on a background.
It seems resumed, but ...

| dhcp21% ps j755
| USER   PID  PPID  PGID   SESS JOBC STAT  TT       TIME COMMAND
| akr    755   753   755 92fdc0    1 T     p1    0:00.00 sleep 10

Check the process status by ps again.
The process is not resumed.

| dhcp21% kill -9 755
| [1]  + done       echo | 
|        killed     sleep 10
| dhcp21% exit

kill the process and exit.

| Z:akr@dhcp21% kdump|grep kill
|    753 zsh      CALL  kill(0xfffffd0d,0)                # kill(-755,0)
|    753 zsh      RET   kill 0
|    753 zsh      CALL  kill(0xfffe7960,0)                # kill(-100000,0)
|    753 zsh      RET   kill -1 errno 3 No such process
|    753 zsh      CALL  kill(0xfffffd0e,0x13)             # kill(-754,SIGCONT)
|    753 zsh      RET   kill -1 errno 3 No such process
|    753 zsh      CALL  kill(0xfffe7960,0)                # kill(-100000,0)
|    753 zsh      RET   kill -1 errno 3 No such process
|    753 zsh      CALL  kill(0x2f3,0x9)                   # kill(755,SIGKILL)
|    753 zsh      RET   kill 0
|                killed     sleep 10
| Z:akr@dhcp21% 

There are `kill system call' called by zsh.  I suppose the system call
correspondding to the `bg' is `kill(-754,SIGCONT)'.  It's failed
because the process group 754 is not exist.  I think it is wrong that
the sleep process has process group 755 rather than 754.  Because zsh
assigns a process group as a process number of first component of a
pipe.

Note that if `fg' is used for resume the job, zsh hangs.
-- 
Tanaka Akira


^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2000-05-08  9:17 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2000-05-08  8:48 fg/bg on FreeBSD Sven Wischnowsky
2000-05-08  9:17 ` Tanaka Akira
  -- strict thread matches above, loose matches on Subject: below --
2000-05-06 15:03 Tanaka Akira
2000-05-06 17:08 ` Bart Schaefer
2000-05-06 17:48   ` Tanaka Akira
2000-05-06 18:45     ` Bart Schaefer
2000-05-06 19:03       ` Tanaka Akira
2000-05-06 19:58     ` Tanaka Akira
2000-05-06 21:23       ` Bart Schaefer
2000-05-06 21:41         ` Tanaka Akira

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).