kill function fow MinGW

Machine-specific discussion
Unix, Linux, OS X, OS/2, Windows, ..?
Locked
kosh
Posts: 72
Joined: Sun Sep 13, 2009 5:38 am
Location: Japan
Contact:

kill function fow MinGW

Post by kosh »

Hello Lutz.

This patch is implementation 'kill' function for MinGW (Windows).
and modified 'plainProcess' and 'p_destroy' functions.

Code: Select all

int kill(pid_t pid, int sig);
'kill' function terminates specified process by process ID.
However, second argument (int sig) will be ignored.

Code: Select all

diff -wru newlisp-10.4.4-orig/nl-filesys.c newlisp-10.4.4/nl-filesys.c
--- newlisp-10.4.4-orig/nl-filesys.c	2012-09-14 00:00:27 +0900
+++ newlisp-10.4.4/nl-filesys.c	2012-10-05 14:34:46 +0900
@@ -72,6 +72,8 @@
 #define pclose _pclose
 #define pipe _pipe
 
+int kill(pid_t pid, int sig);
+
 /* 
 Set binary as default file mode for Windows.
 See also http://www.mingw.org/MinGWiki/index.php/binary
@@ -1142,22 +1144,25 @@
 {
 char * cPtr;
 char * argv[16];
-int idx;
+HANDLE hProc;
+DWORD pid;
 
 cPtr = callocMemory(len + 1);
 memcpy(cPtr, command, len + 1);
 
 init_argv(cPtr, argv);
 
-idx = spawnvp(P_NOWAIT, argv[0], (const char * const *)argv); 
+hProc = (HANDLE)_spawnvp(P_NOWAIT, argv[0], (const char * const *)argv); 
 
 free(cPtr);
-if(idx == -1) return(nilCell);
+if (hProc == INVALID_HANDLE_VALUE) return nilCell;
 
-return(stuffInteger(idx));
+pid = GetProcessId(hProc);
+CloseHandle(hProc);
+return stuffInteger(pid);
 }
 
-
+#if 0
 CELL * p_destroyProcess(CELL * params)
 {
 UINT pid;
@@ -1171,7 +1176,7 @@
 
 return(trueCell);
 }
-
+#endif
 
 #else /* not WIN_32 */
 
@@ -1843,23 +1848,6 @@
 /* --------------------------- end Cilk ------------------------------------- */
 
 
-CELL * p_destroyProcess(CELL * params)
-{
-UINT pid;
-UINT sig;
-
-params = getInteger(params, &pid);
-if(params != nilCell)   
-    getInteger(params, &sig);
-else
-    sig = 9;
-
-if(kill(pid, sig) != 0)
-    return(nilCell);
-
-return(trueCell);
-}
-
 extern SYMBOL * symHandler[];
 
 CELL * p_waitpid(CELL * params)
@@ -1889,6 +1877,23 @@
 
 #endif
 
+CELL * p_destroyProcess(CELL * params)
+{
+UINT pid;
+UINT sig;
+
+params = getInteger(params, &pid);
+if(params != nilCell)   
+    getInteger(params, &sig);
+else
+    sig = 9;
+
+if(kill(pid, sig) != 0)
+    return(nilCell);
+
+return(trueCell);
+}
+
 /* ------------------------------ semaphores --------------------------------- */
 
 #ifdef WIN_32
diff -wru newlisp-10.4.4-orig/win32-util.c newlisp-10.4.4/win32-util.c
--- newlisp-10.4.4-orig/win32-util.c	2012-09-14 00:00:27 +0900
+++ newlisp-10.4.4/win32-util.c	2012-10-05 14:29:12 +0900
@@ -25,6 +25,19 @@
 #include <windows.h>
 #include <io.h>
 
+/* kill for MinGW */
+int kill(pid_t pid, int sig)
+{
+  int ret;
+  HANDLE h;
+  /* if (pid > 0 && sig == SIGTERM) { */
+  h = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
+  if (h == NULL) return -1;
+  ret = TerminateProcess(h, 0) ? 0 : -1;
+  CloseHandle(h);
+  /* } */
+  return ret;
+}
 
 /*
 typedef struct _PROCESS_INFORMATION { // pi  
Example:

Code: Select all

$ newlisp
> (setq pid (process "notepad.exe"))
5156
> (destroy pid)		; kll process
true
> (destroy pid)		; already killed
nil
> (destroy (sys-info -3))	; kill your own process
$ 

Lutz
Posts: 5289
Joined: Thu Sep 26, 2002 4:45 pm
Location: Pasadena, California
Contact:

Re: kill function fow MinGW

Post by Lutz »

Thanks Kosh, changes can be found here:

http://www.newlisp.org/downloads/develo ... nprogress/

Note that I also added similar changes to the function winPipedProcess() in win32-util.c.

Locked