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