support kill(0,$pid) on Windows to test if process exists
Gurusamy Sarathy [Wed, 1 Mar 2000 03:04:54 +0000 (03:04 +0000)]
p4raw-id: //depot/perl@5386

README.win32
pod/perldelta.pod
pod/perlport.pod
win32/win32.c

index 5499d3a..830e129 100644 (file)
@@ -679,9 +679,9 @@ C<kill()> is implemented, but doesn't have the semantics of
 C<raise()>, i.e. it doesn't send a signal to the identified process
 like it does on Unix platforms.  Instead it immediately calls
 C<TerminateProcess(process,signal)>.  Thus the signal argument is
-used to set the exit-status of the terminated process.  In particular,
-C<kill(0,$pid)> will kill the process identified by C<$pid> (unlike
-on Unix).  This behavior may change in future.
+used to set the exit-status of the terminated process.  However,
+a signal of 0 can be used to safely check if the specified process
+exists, as on Unix.
 
 =item *
 
index 205365e..7345727 100644 (file)
@@ -1287,6 +1287,9 @@ system(1,...) now returns true process IDs rather than process
 handles.  kill() accepts any real process id, rather than strictly
 return values from system(1,...).
 
+For better compatibility with Unix, C<kill(0, $pid)> can now be used to
+test whether a process exists.
+
 The C<Shell> module is supported.
 
 Rudimentary support for building under command.com in Windows 95
index 3009780..b062b3b 100644 (file)
@@ -1459,8 +1459,9 @@ Available only for socket handles. (S<RISC OS>)
 Not implemented, hence not useful for taint checking. (S<Mac OS>,
 S<RISC OS>)
 
-Unlike Unix platforms, C<kill(0, $pid)> will actually terminate
-the process.  (Win32)
+C<kill($sig, $pid)> makes the process exit immediately with exit
+status $sig.  As in Unix, if $sig is 0 and the specified process exists,
+it returns true without actually terminating it. (Win32)
 
 =item link OLDFILE,NEWFILE
 
index 4a7f091..54f0455 100644 (file)
@@ -989,6 +989,8 @@ win32_kill(int pid, int sig)
        /* it is a pseudo-forked child */
        long child = find_pseudo_pid(-pid);
        if (child >= 0) {
+           if (!sig)
+               return 0;
            hProcess = w32_pseudo_child_handles[child];
            if (TerminateThread(hProcess, sig)) {
                remove_dead_pseudo_process(child);
@@ -1001,6 +1003,8 @@ win32_kill(int pid, int sig)
     {
        long child = find_pid(pid);
        if (child >= 0) {
+           if (!sig)
+               return 0;
            hProcess = w32_child_handles[child];
            if (TerminateProcess(hProcess, sig)) {
                remove_dead_process(child);
@@ -1009,9 +1013,13 @@ win32_kill(int pid, int sig)
        }
        else {
            hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, pid);
-           if (hProcess && TerminateProcess(hProcess, sig)) {
-               CloseHandle(hProcess);
-               return 0;
+           if (hProcess) {
+               if (!sig)
+                   return 0;
+               if (TerminateProcess(hProcess, sig)) {
+                   CloseHandle(hProcess);
+                   return 0;
+               }
            }
        }
     }