Re: [Hampshire] Is my program detached?

Top Page

Reply to this message
Author: Bob Dunlop
Date:  
To: hampshire
Subject: Re: [Hampshire] Is my program detached?
On Mon, Sep 28 at 11:24, Stephen Pelc wrote:
> I need to determine if my Linux program is running detached,
> e.g. if it was launched by
> vfxlin
> or
> vfxlin &


Uhm the second process isn't detached it's backgrounded which
isn't the same thing, it will still have a controlling terminal.

If your question was "Is my program in foreground or background?"
the following C demo should help. It works by comparing the
programs process group with that currently selected foreground
group on the controlling terminal. Also demos basic detached
opertion detection along the way.

> Is there a standard way for the vfxlin program to determine
> this? It would also be useful to know if input or output is
> being piped.


fstat() on the file descriptor should help. The st_mode field
should help you distingush between plain files, character
devices (tty or /dev/null etc) and fifo/pipes.


/*
 *    Work out if a program is in foreground or background.
 *
 *    Report result via syslog for detached process, and
 *    via stderr for attached.
 */


#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <syslog.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>

#define INIT_PID    1


int
main( int argc, char *argv[] )
{
    int fd;
    pid_t ppid;
    pid_t mypgrp;
    pid_t ctpgrp;
    char *myname;
    int i;


    /* Get the program name for reports */
    myname = strrchr( argv[0],'/');
    if ( myname )
        myname++;
    else
        myname = argv[0];


    /* Try to open the controlling tty */
    fd = open("/dev/tty", O_RDONLY );
    if ( fd < 0 )
    {
        /* No controlling tty, report via syslog */
        ppid = getppid();
        if ( ppid == INIT_PID )
        syslog( LOG_INFO,"%s is detached child of init.", myname );
        else
        syslog( LOG_INFO,"%s is detached child of PID %d.", myname, ppid );
        exit( 0 );
    }


    /* Get our process group */
    mypgrp = getpgrp();


    /* Now report our state 10 times to allow playing for fg/bg settings */
    for ( i = 0 ; i < 10 ; i++ )
    {
        /* Get the controlling terminal group */
        ctpgrp = tcgetpgrp( fd );


        /* Report */
        if ( ctpgrp == mypgrp )
        fprintf( stderr,"%s is in foreground. (%d)\n", myname, mypgrp );
        else
        fprintf( stderr,"%s is in background. (%d != %d)\n", myname, mypgrp, ctpgrp );
        sleep( 2 );
    }


    close( fd );
    exit( 0 );
}


-- 
        Bob Dunlop