Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 23 Jun 2009 22:00:12 GMT
From:      dfilter@FreeBSD.ORG (dfilter service)
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: bin/74404: commit references a PR
Message-ID:  <200906232200.n5NM0CdX077909@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/74404; it has been noted by GNATS.

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: bin/74404: commit references a PR
Date: Tue, 23 Jun 2009 21:50:17 +0000 (UTC)

 Author: jilles
 Date: Tue Jun 23 21:50:06 2009
 New Revision: 194774
 URL: http://svn.freebsd.org/changeset/base/194774
 
 Log:
   Do not fork for a subshell if it is the last thing this shell is doing
   (EV_EXIT). The fork is still done as normal if any traps are active.
   
   In many cases, the fork can be avoided even without this change by using {}
   instead of (), but in practice many scripts use (), likely because the
   syntax is simpler.
   
   Example:
     sh -c '(/bin/sleep 10)& sleep 1;ps -p $! -o comm='
   Now prints "sleep" instead of "sh". $! is more useful this way.
   Most shells (dash, bash, pdksh, ksh93, zsh) seem to print "sleep" for this.
   
   Example:
     sh -c '( ( ( (ps jT))))'
   Now shows no waiting shell processes instead of four.
   Most shells (dash, bash, pdksh, ksh93, zsh) seem to show zero or one.
   
   PR:		bin/74404
   Approved by:	ed (mentor) (implicit)
 
 Modified:
   head/bin/sh/eval.c
 
 Modified: head/bin/sh/eval.c
 ==============================================================================
 --- head/bin/sh/eval.c	Tue Jun 23 21:48:04 2009	(r194773)
 +++ head/bin/sh/eval.c	Tue Jun 23 21:50:06 2009	(r194774)
 @@ -401,8 +401,8 @@ evalsubshell(union node *n, int flags)
  	int backgnd = (n->type == NBACKGND);
  
  	expredir(n->nredir.redirect);
 -	jp = makejob(n, 1);
 -	if (forkshell(jp, n, backgnd) == 0) {
 +	if ((!backgnd && flags & EV_EXIT && !have_traps()) ||
 +			forkshell(jp = makejob(n, 1), n, backgnd) == 0) {
  		if (backgnd)
  			flags &=~ EV_TESTED;
  		redirect(n->nredir.redirect, 0);
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200906232200.n5NM0CdX077909>