Bug #75749 [Opn->NoF]: pcntl_fork does not duplicate stream_sockets

From: Date: Fri, 10 Feb 2023 14:18:25 +0000
Subject: Bug #75749 [Opn->NoF]: pcntl_fork does not duplicate stream_sockets
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-243706@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=75749&edit=1 ID: 75749 Updated by: bukka@php.net Reported by: michaela dot merz at roillofone dot com Summary: pcntl_fork does not duplicate stream_sockets -Status: Open +Status: No Feedback Type: Bug Package: Streams related Operating System: Linux PHP Version: 7.0.26 -Assigned To: +Assigned To: bukka Block user comment: N Private report: N New Comment: I had a look into this and tried to recreate with the following script: <?php $s1 = stream_socket_server('127.0.0.1:8501'); $s2 = stream_socket_server('127.0.0.1:8502'); $conn1 = stream_socket_accept($s1); $conn2 = stream_socket_accept($s2); $pid = pcntl_fork(); if ($pid > 0) { $read = [$conn1, $conn2]; $write = $except = null; var_dump(stream_select($read, $write, $except, 10)); sleep(1); fwrite($conn1, "parent test conn 1\n"); fwrite($conn2, "parent test conn 2\n"); fclose($conn1); fclose($conn2); echo "Parent ends\n"; } else { sleep(1); fwrite($conn1, "child test conn 1\n"); fwrite($conn2, "child test conn 2\n"); fclose($conn1); fclose($conn2); echo "Child ends\n"; } Then I tested that in nc and all worked as expected. It means getting either Child ends int(0) Parent ends conn1 received: child test conn 1 parent test conn 1 and conn2 received: child test conn 2 parent test conn 2 It also worked if I wrote something in one of the child connection. Then the parent result was Child ends int(1) Parent ends It means that closing connection in child does not impact in any way the parent connectiont which is expected and works like in C which also matches my expectations when looking to the code. I think we need the already requested test case for this. I will close this bug with "No Feedback" but feel free to open a new GitHub issue if you still experience the problem. As noted a test script will be required. Previous Comments: ------------------------------------------------------------------------ [2017-12-30 23:13:37] fmargaine@php.net Hi, Could you provide a reproducible test case? ------------------------------------------------------------------------ [2017-12-30 22:46:23] michaela dot merz at roillofone dot com Description: ------------ Process "A" has a number of open network stream sockets and watches those sockets via stream_select. Some are in "accepted" state (the connection has been established). Process "A" maintains static connections (think IRC) itself while http-connections are passed to pcntl_fork() after being accepted. Let's say parent process "A" has accepted #23 and #24 . #24 is handled in a daughter process "B". If "B" exits .. or fclose(#23) is called by "B" , the resource #23 in "A" is also terminated. According to the (C-) norm. file descriptors should be copied and closing them in a fork()ed process should not influence the master process. Same should be valid for stream resources. ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=75749&edit=1

« previous php.bugs (#243706) next »