Wow! Thanks for this very detailed anwser!
I really could not understand everything because of my limitation about this topic, but I really could understand the reasons that it will not works fine and I agree that, for now, it is not a good idea (because of hackish way to implement it, mainly). Thank you! 2018-01-22 13:58 GMT-02:00 Thomas Hruska <thru...@cubiclesoft.com>: > On 1/22/2018 5:16 AM, David Rodrigues wrote: > >> Hello. >> >> I know that PCNTL extension is not compatible with Windows, but I can't >> found the reason for that. >> >> I mean, I know that it is a feature that Unix system could provide in a >> better way (natively I guess). But "why" Windows could not emulates this >> features and have a PCNTL support too? Even if it had a lower performance, >> it still could be useful on testing environments. >> >> So the question is: there are some hard limitation to it be impossible or >> would it be kind of a "lack of interest"? >> >> Thanks! >> > > Windows is a completely different OS. > > > Windows does not have signals: > > https://stackoverflow.com/questions/3333276/signal-handling-on-windows > > That rules out all of PCNTL's signal handling support, which is 11 out of > the 22 functions that PCNTL has (I'm excluding aliases in that count). > Simply being unable to implement 50% of the functions is not a good start > to a successful port. > > > Windows does not have fork/exec. Although there are non-starter > "solutions": > > https://en.wikipedia.org/wiki/Fork%E2%80%93exec > > Windows starts and manages processes VERY differently from *NIX. Cygwin > apparently has a working fork/exec implementation for Windows, but Cygwin > is GPL. Any implementation would have to be clean-roomed for PHP and would > likely involve ugly things such as copying raw memory from one process > space to another and/or using undocumented Zw kernel calls, all of which > can change dramatically between OS releases. > > > Windows processes are referenced by HANDLE, not process ID. Referencing > by process ID might seem doable with OpenProcess(): > > https://msdn.microsoft.com/en-us/library/windows/desktop/ms6 > 84320(v=vs.85).aspx > > But even PROCESS_QUERY_LIMITED_INFORMATION access might be denied when > attempting to open the handle. Even for child processes. It happens when > a process changes its own DACLs specifically to block > OpenProcess()/OpenThread() calls. Although the approach can't readily > block SeDebugPrivilege, you don't ever want PHP core/userland running with > SeDebugPrivilege. > > A PHP implementation might work fine for direct children for most > use-cases where the HANDLEs are kept around, but grandchildren might not be > accessible. Also, there's already the "proc_..." series of functions for > handling child processes, which more correctly uses generic resource > handles instead of integers. > > > Windows does not know what a zombie process is. Unlike *NIX, Windows > doesn't have a rule that a child must have a parent and that the parent > must wait on each child to exit before the parent itself exits. Windows > processes can exit whenever they want and the kernel cleans up after the > process. > > > Windows does have a few process priorities: > > https://msdn.microsoft.com/en-us/library/windows/desktop/ms6 > 86219(v=vs.85).aspx > > However, you can do things such as completely freeze up Windows - > including the keyboard processing buffer and mouse cursor - with a process > priority of REALTIME_PRIORITY_CLASS and a "while (1)" loop where the > specified process will get *exclusive* scheduling by the kernel (i.e. a > reboot is the only option). It's a little-known security > vulnerability-waiting-to-happen bit of Windows API history. > > > I dunno. When all is said and done, pcntl_getpriority(), > pcntl_setpriority(), pcntl_get_last_error(), pcntl_strerror(), and maybe > pcntl_wait() and associated status functions are about the only functions > that can be somewhat cleanly implemented for Windows using Windows APIs > with minimal effort. pcntl_waitpid() might be able to be implemented with > some effort but possibly not work properly for pids less than 1 (with all > the usual waitpid() caveats). The signal handling are simply not doable. > Implementing fork/exec doesn't make a lot of sense - a lot of effort for > little gain. > > -- > Thomas Hruska > CubicleSoft President > > I've got great, time saving software that you will find useful. > > http://cubiclesoft.com/ > > And once you find my software useful: > > http://cubiclesoft.com/donate/ > -- David Rodrigues