ID:               38273
 User updated by:  axelluttgens at swing dot be
 Reported By:      axelluttgens at swing dot be
-Status:           Feedback
+Status:           Open
 Bug Type:         PCNTL related
 Operating System: Mac OSX 10.4.7
 PHP Version:      4.4.2
 New Comment:

Hello Jani,

I'll try to test the case with the php5.2-200707130630 snapshot during
this week-end.

Thanks for the follow-up,
Axel


Previous Comments:
------------------------------------------------------------------------

[2007-07-11 13:05:39] [EMAIL PROTECTED]

Please try the 5.2 snapshot as requested before. We are going to
discontinue support for PHP 4 this year so it is very unlikely that this
bug will ever get fixed in PHP 4. But if the bug does not exist in PHP
5.2 it's possible to backport the fix from it to PHP 4.

------------------------------------------------------------------------

[2006-08-02 11:05:58] axelluttgens at swing dot be

As a follow-up: a "switch" statement, instead of reproduce code's "if"
statement, does not seem to be affected by the problem.

So, replacing the while loop in reproduce code with this one:

while (!socket_select($r = array($endpoint), $w = NULL, $e = NULL,
NULL))
        switch ($err = socket_last_error())
        {
                case SOCKET_EINTR:
                        socket_clear_error();
                        PollSigs();
                        break;
                default:
                        echo "socket_select() failed with $err\n";
                        break 2;
        }


I get the expected behavior back (without having to resort to the
"dummy statement" kludge):

$ /Volumes/Data/Sources/sigtest.php 

^C
Warning: socket_select() unable to select [4]: Interrupted system call
in /Volumes/Data/Sources/sigtest.php on line 32
Received SIGINT
Handling SIGINT
^C
Warning: socket_select() unable to select [4]: Interrupted system call
in /Volumes/Data/Sources/sigtest.php on line 32
Received SIGINT
Handling SIGINT

Could this be of some help for narrowing the cause?

------------------------------------------------------------------------

[2006-08-01 11:59:14] axelluttgens at swing dot be

Hello Tony, thanks again for your follow up!

For various reasons, I am currently really stuck with PHP 4 here. In
that sense, PHP 5 isn't an alternative for me yet.

But perhaps were you considering a very precise point?
Do you want me to try something else?

TIA,
Axel

------------------------------------------------------------------------

[2006-07-31 20:13:53] [EMAIL PROTECTED]

Please try using this CVS snapshot:

  http://snaps.php.net/php5.2-latest.tar.gz
 
For Windows:
 
  http://snaps.php.net/win32/php5.2-win32-latest.zip



------------------------------------------------------------------------

[2006-07-31 19:40:17] axelluttgens at swing dot be

Description:
------------
It seems there is a problem with the construction of the return address
to be used after an interrupt handler.

Now, I'm not sure whether the problem is a general one, or more
precisely located in the socket_xxx() family of functions.
I used the socket_select() function for building the example, as I
needed a function whose execution is liable to be suspended until the
occurence of an interrupt.

But the "workaround" described hereafter anyway seems to reveal some
misbehavior.

Reproduce code:
---------------
Create an executable file, say "sigtest.php", with following contents:

#!/usr/local/bin/php

<?php

declare(ticks = 1);

$gotINT = FALSE;

function SaveINT()
{
        $GLOBALS['gotINT'] = TRUE;
        echo "Received SIGINT\n";
}

function HandleINT()
{
        echo "Handling SIGINT\n";
}

function PollSigs()
{
        if ($GLOBALS['gotINT'])
                HandleINT();
}

pcntl_signal(SIGINT, 'SaveINT');

$endpoint = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($endpoint, '127.0.0.1', 12345);
socket_listen($endpoint, 10);
while (!socket_select($r = array($endpoint), $w = NULL, $e = NULL,
NULL))
        if (($err = socket_last_error()) === SOCKET_EINTR)
        {
                # $err = $err;
                PollSigs();
        }
        else
        {
                echo "socket_select() failed with $err\n";
                exit(1);
        }

?>

Expected result:
----------------
During execution of above file on the terminal, a break (^C) should
result in:

1. the capture of SIGINT, and thus the execution of SaveINT(),
2. the continuation of execution after socket_select(), and thus the
execution of HandleINT() consecutively to the call of PollSigs(). 

Actual result:
--------------
[1] With above code, launching the executable yields:

$ /Volumes/Data/Sources/sigtest.php 

^C
Warning: socket_select() unable to select [4]: Interrupted system call
in /Volumes/Data/Sources/sigtest.php on line 31
Received SIGINT
^C
Warning: socket_select() unable to select [4]: Interrupted system call
in /Volumes/Data/Sources/sigtest.php on line 31
Handling SIGINT
Received SIGINT

[2] Now, uncomment the
   # $err = $err;
line in the source and launch the executable again:

$ /Volumes/Data/Sources/sigtest.php 

^C
Warning: socket_select() unable to select [4]: Interrupted system call
in /Volumes/Data/Sources/sigtest.php on line 31
Received SIGINT
Handling SIGINT
^C
Warning: socket_select() unable to select [4]: Interrupted system call
in /Volumes/Data/Sources/sigtest.php on line 31
Received SIGINT
Handling SIGINT

The dummy instruction (ie, $err = $err;) thus allows to restore
exepected behavior.


------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=38273&edit=1

Reply via email to