http://www.perlmonks.org?node_id=1011081


in reply to Re: Forking an operative terminal
in thread Forking an operative terminal

Hey! it works!

The third option you suggested does the job, using as well sh or bash as xterm or gnome-terminal. I include the code:

... $tks->signal_connect( 'clicked' => sub { my $command = "tw pro:$currproj"; my $ret = fork(); if($ret == 0) { # this is the fork: become $command and go away. exec("gnome-terminal", "-e", "bash -c '$command; bash'"); } else { # this is the parent: do nothing and go ahead. } return FALSE; } );

I detect zombie processes remaining in my ps -e:

2504 ? 00:00:01 perl 2509 ? 00:00:01 gnome-terminal <defunct> 2573 ? 00:00:01 gnome-terminal <defunct> 2638 ? 00:00:01 gnome-terminal <defunct> 2702 ? 00:00:01 gnome-terminal <defunct> 2767 ? 00:00:00 gnome-terminal 2773 ? 00:00:00 gnome-pty-helpe
that dissapear when the perl script comes to en end. Thank you very much, Anonymous Wisdom.

Replies are listed 'Best First'.
Re^3: Forking an operative terminal
by Anonymous Monk on Dec 31, 2012 at 19:03 UTC

    You can get rid of the defunct processes by setting $SIG{CHLD} = 'IGNORE' in the parent. Also, you should use sh -c instead of bash -c in "bash -c '$command; bash'", since only sh is guaranteed to exist.

    And the user's shell can be found with this piece of code:

    my ($shell, $uid); while (($uid, $shell) = (getpwent)[2,8]) { last if $uid == $<; } say $shell;

      Fine, I was trying to place an 'exit' into the exec to solve the problem, but the signal handler worked perfectly and sent the zombies back to their niches. As well as the code for user shell determination. Thanks again, your Wisdom.

      I also want to apologize because now I realize that my question concerned the shell and OS, not perl. Happy New Year to all the Monastery.