[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. 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(); }
>     while (!-e "stop") { sleep(10); }
>     kill('QUIT', $pid);
> }

Both your parent and child processes are executing the 'while'
and 'kill' statements.

> sub player
> {
>     system("alsaplayer -q song.mp3");
>     sleep;
> }
>
> 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.
>
> Am I missing something here? Any idea how I could do this differently?

Here's a rewrite of what you had:

    sub controller
    {
        my $pid = fork;
        player() unless $pid;
        sleep(10) UNTIL -e "stop";
        kill 'QUIT', $pid;
    }

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

The subroutine 'player' looks OK, but how about this for 'controller'

    sub controller
    {
        my $pid = fork;
        die "Unable to fork" unless defined $pid;

        if ( $pid == 0 ) {
            player();
        } else {
            sleep(10) until -e "stop";
            kill 'QUIT', $pid;
        }
    }

HTH,

Rob




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

Reply via email to