RE: [ast-developers] ksh process group problem

2011-06-16 Thread Brian Ginn
Thanks.

Is there a reliable way to for a process to determine if it is running in the 
background?


-Brian


-Original Message-
From: Glenn Fowler [mailto:g...@research.att.com] 
Sent: Tuesday, June 14, 2011 2:22 PM
To: ast-developers@research.att.com; Brian Ginn; d...@research.att.com
Subject: RE: [ast-developers] ksh process group problem


On Tue, 14 Jun 2011 14:19:07 -0700 Brian Ginn wrote:
 Rather than forcing my program to the foreground, my program wants to know 
 whether it was executed in the background with , or whether it is in the 
 foreground.

 I am testing tcgetpgrp(fileno(stdin) against getpgid(getpid()).  If they are 
 different, my program avoids calling tcgetattr() and tcsetattr(), thus 
 avoiding an unnecessary SIGTTOU if terminal I/O is not needed.

 Is there a better way to determine if a program is running in the background?

 Also, it looks like SUSv3 posix_spawn() can set the process group:
 If the POSIX_SPAWN_SETPGROUP flag is set in the spawn-flags attribute of the 
 object referenced by attrp, and the spawn-pgroup attribute of the same object 
 is non-zero, then the child's process group shall be as specified in the 
 spawn-pgroup attribute of the object referenced by attrp.

 As a special case, if the POSIX_SPAWN_SETPGROUP flag is set in the 
 spawn-flags attribute of the object referenced by attrp, and the spawn-pgroup 
 attribute of the same object is set to zero, then the child shall be in a new 
 process group with a process group ID equal to its process ID.

 If the POSIX_SPAWN_SETPGROUP flag is not set in the spawn-flags attribute of 
 the object referenced by attrp, the new child process shall inherit the 
 parent's process group.

the ast spwanveg() when iffe'd for posix_spawn() uses POSIX_SPAWN_SETPGROUP
this doesn't help with tcsetattr() however since process group != terminal group


__
This email has been scanned by the MessageLabs Email Security System.
For more information please visit http://www.messagelabs.com/email 
__

___
ast-developers mailing list
ast-developers@research.att.com
https://mailman.research.att.com/mailman/listinfo/ast-developers


RE: [ast-developers] ksh process group problem

2011-06-14 Thread Brian Ginn
Rather than forcing my program to the foreground, my program wants to know 
whether it was executed in the background with , or whether it is in the 
foreground.

I am testing tcgetpgrp(fileno(stdin) against getpgid(getpid()).  If they are 
different, my program avoids calling tcgetattr() and tcsetattr(), thus avoiding 
an unnecessary SIGTTOU if terminal I/O is not needed.

Is there a better way to determine if a program is running in the background?


Also, it looks like SUSv3 posix_spawn() can set the process group:
If the POSIX_SPAWN_SETPGROUP flag is set in the spawn-flags attribute of the 
object referenced by attrp, and the spawn-pgroup attribute of the same object 
is non-zero, then the child's process group shall be as specified in the 
spawn-pgroup attribute of the object referenced by attrp.

As a special case, if the POSIX_SPAWN_SETPGROUP flag is set in the spawn-flags 
attribute of the object referenced by attrp, and the spawn-pgroup attribute of 
the same object is set to zero, then the child shall be in a new process group 
with a process group ID equal to its process ID.

If the POSIX_SPAWN_SETPGROUP flag is not set in the spawn-flags attribute of 
the object referenced by attrp, the new child process shall inherit the 
parent's process group.



Thanks,
Brian Ginn



-Original Message-
From: ast-developers-boun...@research.att.com 
[mailto:ast-developers-boun...@research.att.com] On Behalf Of David Korn
Sent: Tuesday, June 14, 2011 1:32 PM
To: ast-developers@research.att.com; Brian Ginn
Subject: Re: [ast-developers] ksh process group problem

cc: ast-developers@research.att.com
Subject: Re: [ast-developers] ksh process group problem



ksh93 uses posix_spawn() rather than fork/exec to run a simple command for
performance reasons.  However, posix_spawnv() doesn't have a way to
set the terminal group before the exec().  The parent process sets the
terminal group which leads to the race.

There is a simple change you can make to a program to guarentee that
the terminal will get set at the beginning of the program.
You can add two lines.  One line is
#includetermios.h

and for the other line  
tcsetpgrp(2,getpgrp());
Alternatively, you can write a program that does these two lines and
then execs the original program.

 I am seeing an intermittent problem on Red Hat Enterprise Linux 5.4 and 5.6, 
 and
  HP-UX 11.0 and 11.31.
 The processes launched from the AST ksh sometimes own the terminal, and 
 someti
 mes don't.
 
 
 Output from the test program below demonstrates the issue:
 
 
 [fbg@sturgeon ~]$ /opt/ast/bin/ksh
 
 $ /tmp/testprocessgroup_linux64
 
 PID: 8678  MY_pgrp=8678 STDIN_PGRP:8674 --DO NOT own terminal
 
 $ /tmp/testprocessgroup_linux64
 
 PID: 8679  MY_pgrp=8679 STDIN_PGRP:8679 --own terminal
 
 $ /tmp/testprocessgroup_linux64
 
 PID: 8680  MY_pgrp=8680 STDIN_PGRP:8680 --own terminal
 
 $ /tmp/testprocessgroup_linux64
 
 PID: 8681  MY_pgrp=8681 STDIN_PGRP:8681 --own terminal
 
 $ /tmp/testprocessgroup_linux64
 
 PID: 8682  MY_pgrp=8682 STDIN_PGRP:8674 --DO NOT own terminal
 
 $ /tmp/testprocessgroup_linux64
 
 PID: 8683  MY_pgrp=8683 STDIN_PGRP:8683 --own terminal
 
 $ /tmp/testprocessgroup_linux64
 
 PID: 8684  MY_pgrp=8684 STDIN_PGRP:8674 --DO NOT own terminal
 
 $
 
 
 
 
 [fbg@sturgeon pgrp]$ cat testprocessgroup.c
 #include stdio.h
 #include sys/types.h
 #include unistd.h
 #include sys/stat.h
 #include fcntl.h
 
 int main(int argc, char **argv)
 {
 int devtty;
 
 
 printf(PID:%5lu  MY_pgrp=%d STDIN_PGRP:%d --%s\n,
getpid(),
getpgid(getpid()),
tcgetpgrp(fileno(stdin)),
tcgetpgrp(fileno(stdin)) == getpgid(getpid()) ? own terminal 
 : 
 DO NOT own terminal );
 
 
 return(0);
 }
 
 __
 This email has been scanned by the MessageLabs Email Security System.
 For more information please visit http://www.messagelabs.com/email 
 __
 (attachment  1   171/10586  text/html 1.att)
 
 ___
 ast-developers mailing list
 ast-developers@research.att.com
 https://mailman.research.att.com/mailman/listinfo/ast-developers
 

David Korn
d...@research.att.com
___
ast-developers mailing list
ast-developers@research.att.com
https://mailman.research.att.com/mailman/listinfo/ast-developers

__
This email has been scanned by the MessageLabs Email Security System.
For more information please visit http://www.messagelabs.com/email 
__

___
ast-developers mailing list
ast-developers@research.att.com
https://mailman.research.att.com/mailman/listinfo/ast-developers


RE: [ast-developers] ksh process group problem

2011-06-14 Thread Glenn Fowler

On Tue, 14 Jun 2011 14:19:07 -0700 Brian Ginn wrote:
 Rather than forcing my program to the foreground, my program wants to know 
 whether it was executed in the background with , or whether it is in the 
 foreground.

 I am testing tcgetpgrp(fileno(stdin) against getpgid(getpid()).  If they are 
 different, my program avoids calling tcgetattr() and tcsetattr(), thus 
 avoiding an unnecessary SIGTTOU if terminal I/O is not needed.

 Is there a better way to determine if a program is running in the background?

 Also, it looks like SUSv3 posix_spawn() can set the process group:
 If the POSIX_SPAWN_SETPGROUP flag is set in the spawn-flags attribute of the 
 object referenced by attrp, and the spawn-pgroup attribute of the same object 
 is non-zero, then the child's process group shall be as specified in the 
 spawn-pgroup attribute of the object referenced by attrp.

 As a special case, if the POSIX_SPAWN_SETPGROUP flag is set in the 
 spawn-flags attribute of the object referenced by attrp, and the spawn-pgroup 
 attribute of the same object is set to zero, then the child shall be in a new 
 process group with a process group ID equal to its process ID.

 If the POSIX_SPAWN_SETPGROUP flag is not set in the spawn-flags attribute of 
 the object referenced by attrp, the new child process shall inherit the 
 parent's process group.

the ast spwanveg() when iffe'd for posix_spawn() uses POSIX_SPAWN_SETPGROUP
this doesn't help with tcsetattr() however since process group != terminal group

___
ast-developers mailing list
ast-developers@research.att.com
https://mailman.research.att.com/mailman/listinfo/ast-developers