Hello Danny,
Wow, thank you for the speedy reply and the suggestions. I've been searching
the Asterisk Mac community (including the voip-info wiki and astmasters.org)
for some time and have been reading the man pages on "alarm" and how
STDIN/OUT are handled both on linux and mac and couldn't come up with any
reason that the code should behave differently.
I was thinking of trying a fork instead of the alarm but figured at a lower
level the alarm was essentially doing the same thing.
Although very simplified, the perl code essentially looks like this:
alarm(3);
$fhO = \*STDOUT if (!$fhO);
select ((select ($fhO), $| = 1)[0]);
print $fhO "$command\n";
$fhI = \*STDIN if (!$fhI);
$response = <$fhI> || '200 result=-1 (noresponse)';
chomp($response);
$timeleft = alarm(0);
On linux the handleAlarm routine runs and finishes without a problem and
when the user finishes recording and presses the # key, then the line
$response = <$fhI> continues. On the Mac, as soon as the alarm goes off
$response gets '200 result=-1 (noresponse)'. If I comment out the alarm(3),
then it works. It's so simple on the Perl side that I now think the problem
must be in the Asterisk C code.
Thanks again,
Chris
"Danny Hembree" <[EMAIL PROTECTED]> wrote in message
news:[EMAIL PROTECTED]
> There is no difference between signals in Linux and signals in OSX, they
> behave the same. However, the way the processes setup may differ. There
> is an OSX asterisk version that should have this sorted out for you.
> There is a lot of help here:
>
> http://www.voip-info.org/tiki-index.php?page=Asterisk%20MacOSX%20Support
>
> On Tue, 2006-01-10 at 08:32, Chris wrote:
>> Hello,
>> I'm pretty much a newbie when it comes to Mac OS X so go easy on me. I
>> have
>> a Perl applicaton that communicates with the Asterisk VoIP phone system
>> through AGI (Asterisk Gateway Interface) very similar to CGI. Asterisk
>> starts my perl application and the two communicate over STDIN and STDOUT
>> file handles. When the user on the phone presses the # key my AGI perl
>> application is suppose to start recording what the users says until they
>> press # again. The way this works, is the perl applications writes the
>> RECORD command to STDOUT and Asterisk starts to record and then the perl
>> program waits on STDIN for the response which would be the # key when the
>> user presses it. I call the "alarm(3)" perl command (having set
>> $SIG{ALRM}
>> = \&handleAlarm; earlier) before issuing the RECORD command to have perl
>> call my handleAlarm() routine to perform some tasks three seconds after
>> the
>> recording starts (like check that the file actually has some sound and to
>> notify others that a messages is currently being recorded).
>
> There are several ways to fork a child process and the way Linux and BSD
> do this has minor variations. The way that it is forked determines
> whether the parent intercepts a signal or passes it to the child. The
> wait mask likewise varies between the OS's. Reading the manual pages
> over and over and experimentation is the only way I've ever gotten these
> things to work. In principal, the wait returns an integer, by masking
> the proper bits one can determine what broke the wait, then decide to
> continue waiting or exit.
>
>>
>> We've been using this application on a Linux machine for over a year and
>> recently I tried to port the whole thing to a Macmini with OS X 10.3.
>> Almost everything works great except, when the alarm goes off the wait on
>> STDIN stops prematurly before Asterisk has actually stopped recording.
>> If I
>> comment out the alarm command the wait on STDIN works fine.
>>
>> I've posted this already in the Asterisk and AstMasters mailing list but
>> I
>> think it may be more perl related then Asterisk related and having
>> something
>> to do wtih the whole alarm subsystem on Mac OS X vs Linux. Asterisk is
>> writen in straight C so perhaps they are both using the same alarm timer.
>> Any thoughts or suggestions would be greatly appreciated because I'm
>> stumped.
>>
>> Thanks,
>> Chris
>>
>>
>