[EMAIL PROTECTED] wrote:
> Hi there
> 
> I'm stuck with system(). According to some posts, system() is passing
> SIGINT and SIGQUIT to it's child, yet this doesn't seem to work. 

No, I don't think that's correct. A terminal driver will catch ^C and ^\ and
send the appropriate signals to all the processes in the foreground process
group, but that has nothing to do with system().

> I've
> boiled the code down to the following lines. (Please note that
> 'alsaplayer' is a console soundfile player that honors SIGINT and
> SIGQUIT by immediately quitting.)
> 
> sub controler
> {
>     my $pid = fork;
>     if (!$pid) { &player(); }

(Lose the & char)

Note that after player returns, the child will execute the code below. The
child should exit() when it's finished.

>     while (!-e "stop") { sleep(10); }
>     kill('QUIT', $pid);

Why use SIGQUIT? Do you want the core dump? SIGTERM would be the typical
use. Also, $pid is the PID of your child, not the PID of alsaplayer. You
kill a process group to send the signal to both, but if you exec()
alsaplayer (see below), you don't have to fool with that.

perldoc -f kill
perldoc -f getpgrp

> }
> 
> sub player
> {
>     system("alsaplayer -q song.mp3");
>     sleep;

Why should the child wait here? If it finishes, why not exit? Also, why not
just use exec() instead of system()? That would make:

  sub player { exec 'alsaplayer -q song.mp3' }
  
> }
> 
> The controler forks off the player child which
> system()-implicitly forks
> again and runs alsaplayer in the child. So the sound's playing. I
> 'touch stop' and the controler signals SIGQUIT to the player child.
> This works as I can see when I catch SIGQUIT there. Still, the
> SIGQUIT is not forwarded to the child running alsaplayer the way it
> is supposed to do 
> - at least according
> to my literature.

I don't think that literature is correct.

> 
> Am I missing something here? Any idea how I could do this differently?

sub controller {
   defined(my $pid = fork) or die "Couldn't fork: $!";
   exec('alsaplayer -q song.mp3') unless $pid;
   sleep 1 while !-e 'stop';
   kill 'TERM', $pid;
}

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to