add signal name lookup support
This commit is contained in:
parent
247937d0bb
commit
123e14e283
|
@ -318,6 +318,24 @@ JNIEXPORT void SIGAR_JNIx(kill)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jint SIGAR_JNIx(getSigNum)
|
||||||
|
(JNIEnv *env, jclass cls_obj, jstring jname)
|
||||||
|
{
|
||||||
|
jboolean is_copy;
|
||||||
|
const char *name;
|
||||||
|
int num;
|
||||||
|
|
||||||
|
name = JENV->GetStringUTFChars(env, jname, &is_copy);
|
||||||
|
|
||||||
|
num = sigar_signum_get((char *)name);
|
||||||
|
|
||||||
|
if (is_copy) {
|
||||||
|
JENV->ReleaseStringUTFChars(env, jname, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
|
||||||
#define SetStringField(env, obj, fieldID, val) \
|
#define SetStringField(env, obj, fieldID, val) \
|
||||||
SetObjectField(env, obj, fieldID, JENV->NewStringUTF(env, val))
|
SetObjectField(env, obj, fieldID, JENV->NewStringUTF(env, val))
|
||||||
|
|
||||||
|
|
|
@ -241,6 +241,37 @@ public class Sigar implements SigarProxy {
|
||||||
*/
|
*/
|
||||||
public native void kill(long pid, int signum) throws SigarException;
|
public native void kill(long pid, int signum) throws SigarException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send a signal to a process.
|
||||||
|
*
|
||||||
|
* @param pid The process id.
|
||||||
|
* @param signum The signal name.
|
||||||
|
* @exception SigarException on failure.
|
||||||
|
*/
|
||||||
|
public void kill(long pid, String signame) throws SigarException {
|
||||||
|
int signum;
|
||||||
|
|
||||||
|
if (Character.isDigit(signame.charAt(0))) {
|
||||||
|
try {
|
||||||
|
signum = Integer.parseInt(signame);
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
signum = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
signum = getSigNum(signame);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (signum < 0) {
|
||||||
|
throw new SigarException(signame +
|
||||||
|
": invalid signal specification");
|
||||||
|
}
|
||||||
|
|
||||||
|
kill(pid, signum);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static native int getSigNum(String name);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send a signal to a process.
|
* Send a signal to a process.
|
||||||
*
|
*
|
||||||
|
|
|
@ -50,18 +50,13 @@ public class Kill extends SigarCommandBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void output(String[] args) throws SigarException {
|
public void output(String[] args) throws SigarException {
|
||||||
int signum = 15; //SIGTERM
|
String signal = "SIGTERM";
|
||||||
long[] pids;
|
long[] pids;
|
||||||
String query;
|
String query;
|
||||||
|
|
||||||
if (args.length == 2) {
|
if (args.length == 2) {
|
||||||
|
signal = args[0];
|
||||||
query = args[1];
|
query = args[1];
|
||||||
try {
|
|
||||||
signum = Integer.parseInt(args[0]);
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
//XXX convert SIGFOO to number
|
|
||||||
throw new SigarException(e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
query = args[0];
|
query = args[0];
|
||||||
|
@ -70,8 +65,8 @@ public class Kill extends SigarCommandBase {
|
||||||
pids = this.shell.findPids(new String[] { query });
|
pids = this.shell.findPids(new String[] { query });
|
||||||
|
|
||||||
for (int i=0; i<pids.length; i++) {
|
for (int i=0; i<pids.length; i++) {
|
||||||
println("kill " + signum + " " + pids[i]);
|
println("kill " + signal + " " + pids[i]);
|
||||||
this.sigar.kill(pids[i], signum);
|
this.sigar.kill(pids[i], signal);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -90,6 +90,8 @@ SIGAR_DECLARE(sigar_pid_t) sigar_pid_get(sigar_t *sigar);
|
||||||
|
|
||||||
SIGAR_DECLARE(int) sigar_proc_kill(sigar_pid_t pid, int signum);
|
SIGAR_DECLARE(int) sigar_proc_kill(sigar_pid_t pid, int signum);
|
||||||
|
|
||||||
|
SIGAR_DECLARE(int) sigar_signum_get(char *name);
|
||||||
|
|
||||||
SIGAR_DECLARE(char *) sigar_strerror(sigar_t *sigar, int err);
|
SIGAR_DECLARE(char *) sigar_strerror(sigar_t *sigar, int err);
|
||||||
|
|
||||||
/* system memory info */
|
/* system memory info */
|
||||||
|
|
40
src/sigar.c
40
src/sigar.c
|
@ -16,7 +16,6 @@
|
||||||
* USA.
|
* USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
#include "sigar.h"
|
#include "sigar.h"
|
||||||
|
@ -24,10 +23,6 @@
|
||||||
#include "sigar_util.h"
|
#include "sigar_util.h"
|
||||||
#include "sigar_os.h"
|
#include "sigar_os.h"
|
||||||
|
|
||||||
#ifndef WIN32
|
|
||||||
#include <signal.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
SIGAR_DECLARE(int) sigar_open(sigar_t **sigar)
|
SIGAR_DECLARE(int) sigar_open(sigar_t **sigar)
|
||||||
{
|
{
|
||||||
int status = sigar_os_open(sigar);
|
int status = sigar_os_open(sigar);
|
||||||
|
@ -67,41 +62,6 @@ SIGAR_DECLARE(sigar_pid_t) sigar_pid_get(sigar_t *sigar)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SIGAR_DECLARE(int) sigar_proc_kill(sigar_pid_t pid, int signum)
|
|
||||||
{
|
|
||||||
#ifdef WIN32
|
|
||||||
int status = -1;
|
|
||||||
HANDLE proc =
|
|
||||||
OpenProcess(PROCESS_ALL_ACCESS,
|
|
||||||
TRUE, (DWORD)pid);
|
|
||||||
|
|
||||||
if (proc) {
|
|
||||||
switch (signum) {
|
|
||||||
case 0:
|
|
||||||
status = SIGAR_OK;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
if (TerminateProcess(proc, signum)) {
|
|
||||||
status = SIGAR_OK;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
CloseHandle(proc);
|
|
||||||
|
|
||||||
if (status == SIGAR_OK) {
|
|
||||||
return SIGAR_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return GetLastError();
|
|
||||||
#else
|
|
||||||
if (kill(pid, signum) == -1) {
|
|
||||||
return errno;
|
|
||||||
}
|
|
||||||
return SIGAR_OK;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *sigar_error_string(int err)
|
static char *sigar_error_string(int err)
|
||||||
{
|
{
|
||||||
switch (err) {
|
switch (err) {
|
||||||
|
|
|
@ -0,0 +1,219 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) [2004, 2005, 2006], Hyperic, Inc.
|
||||||
|
* This file is part of SIGAR.
|
||||||
|
*
|
||||||
|
* SIGAR is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms version 2 of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation. This program is distributed
|
||||||
|
* in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
|
||||||
|
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||||
|
* details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||||
|
* USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "sigar.h"
|
||||||
|
#include "sigar_private.h"
|
||||||
|
#include "sigar_util.h"
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
#include <windows.h>
|
||||||
|
#else
|
||||||
|
#include <signal.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
SIGAR_DECLARE(int) sigar_proc_kill(sigar_pid_t pid, int signum)
|
||||||
|
{
|
||||||
|
#ifdef WIN32
|
||||||
|
int status = -1;
|
||||||
|
HANDLE proc =
|
||||||
|
OpenProcess(PROCESS_ALL_ACCESS,
|
||||||
|
TRUE, (DWORD)pid);
|
||||||
|
|
||||||
|
if (proc) {
|
||||||
|
switch (signum) {
|
||||||
|
case 0:
|
||||||
|
status = SIGAR_OK;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (TerminateProcess(proc, signum)) {
|
||||||
|
status = SIGAR_OK;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
CloseHandle(proc);
|
||||||
|
|
||||||
|
if (status == SIGAR_OK) {
|
||||||
|
return SIGAR_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return GetLastError();
|
||||||
|
#else
|
||||||
|
if (kill(pid, signum) == -1) {
|
||||||
|
return errno;
|
||||||
|
}
|
||||||
|
return SIGAR_OK;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
SIGAR_DECLARE(int) sigar_signum_get(char *name)
|
||||||
|
{
|
||||||
|
if (strnEQ(name, "SIG", 3)) {
|
||||||
|
name += 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (*name) {
|
||||||
|
case 'A':
|
||||||
|
#ifdef SIGABRT
|
||||||
|
if (strEQ(name, "ABRT")) return SIGABRT;
|
||||||
|
#endif
|
||||||
|
#ifdef SIGALRM
|
||||||
|
if (strEQ(name, "ALRM")) return SIGALRM;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case 'B':
|
||||||
|
#ifdef SIGBUS
|
||||||
|
if (strEQ(name, "BUS")) return SIGBUS;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case 'C':
|
||||||
|
#ifdef SIGCONT
|
||||||
|
if (strEQ(name, "CONT")) return SIGCONT;
|
||||||
|
#endif
|
||||||
|
#ifdef SIGCHLD
|
||||||
|
if (strEQ(name, "CHLD")) return SIGCHLD;
|
||||||
|
#endif
|
||||||
|
#ifdef SIGCLD
|
||||||
|
if (strEQ(name, "CLD")) return SIGCLD;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case 'E':
|
||||||
|
#ifdef SIGEMT
|
||||||
|
if (strEQ(name, "EMT")) return SIGEMT;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case 'F':
|
||||||
|
#ifdef SIGFPE
|
||||||
|
if (strEQ(name, "FPE")) return SIGFPE;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case 'H':
|
||||||
|
#ifdef SIGHUP
|
||||||
|
if (strEQ(name, "HUP")) return SIGHUP;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case 'I':
|
||||||
|
#ifdef SIGINT
|
||||||
|
if (strEQ(name, "INT")) return SIGINT;
|
||||||
|
#endif
|
||||||
|
#ifdef SIGILL
|
||||||
|
if (strEQ(name, "ILL")) return SIGILL;
|
||||||
|
#endif
|
||||||
|
#ifdef SIGIOT
|
||||||
|
if (strEQ(name, "IOT")) return SIGIOT;
|
||||||
|
#endif
|
||||||
|
#ifdef SIGIO
|
||||||
|
if (strEQ(name, "IO")) return SIGIO;
|
||||||
|
#endif
|
||||||
|
#ifdef SIGINFO
|
||||||
|
if (strEQ(name, "INFO")) return SIGINFO;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case 'K':
|
||||||
|
#ifdef SIGKILL
|
||||||
|
if (strEQ(name, "KILL")) return SIGKILL;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case 'P':
|
||||||
|
#ifdef SIGPOLL
|
||||||
|
if (strEQ(name, "POLL")) return SIGPOLL;
|
||||||
|
#endif
|
||||||
|
#ifdef SIGPIPE
|
||||||
|
if (strEQ(name, "PIPE")) return SIGPIPE;
|
||||||
|
#endif
|
||||||
|
#ifdef SIGPROF
|
||||||
|
if (strEQ(name, "PROF")) return SIGPROF;
|
||||||
|
#endif
|
||||||
|
#ifdef SIGPWR
|
||||||
|
if (strEQ(name, "PWR")) return SIGPWR;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case 'Q':
|
||||||
|
#ifdef SIGQUIT
|
||||||
|
if (strEQ(name, "QUIT")) return SIGQUIT;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case 'S':
|
||||||
|
#ifdef SIGSEGV
|
||||||
|
if (strEQ(name, "SEGV")) return SIGSEGV;
|
||||||
|
#endif
|
||||||
|
#ifdef SIGSYS
|
||||||
|
if (strEQ(name, "SYS")) return SIGSYS;
|
||||||
|
#endif
|
||||||
|
#ifdef SIGSTOP
|
||||||
|
if (strEQ(name, "STOP")) return SIGSTOP;
|
||||||
|
#endif
|
||||||
|
#ifdef SIGSTKFLT
|
||||||
|
if (strEQ(name, "STKFLT")) return SIGSTKFLT;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case 'T':
|
||||||
|
#ifdef SIGTRAP
|
||||||
|
if (strEQ(name, "TRAP")) return SIGTRAP;
|
||||||
|
#endif
|
||||||
|
#ifdef SIGTERM
|
||||||
|
if (strEQ(name, "TERM")) return SIGTERM;
|
||||||
|
#endif
|
||||||
|
#ifdef SIGTSTP
|
||||||
|
if (strEQ(name, "TSTP")) return SIGTSTP;
|
||||||
|
#endif
|
||||||
|
#ifdef SIGTTIN
|
||||||
|
if (strEQ(name, "TTIN")) return SIGTTIN;
|
||||||
|
#endif
|
||||||
|
#ifdef SIGTTOU
|
||||||
|
if (strEQ(name, "TTOU")) return SIGTTOU;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case 'U':
|
||||||
|
#ifdef SIGURG
|
||||||
|
if (strEQ(name, "URG")) return SIGURG;
|
||||||
|
#endif
|
||||||
|
#ifdef SIGUSR1
|
||||||
|
if (strEQ(name, "USR1")) return SIGUSR1;
|
||||||
|
#endif
|
||||||
|
#ifdef SIGUSR2
|
||||||
|
if (strEQ(name, "USR2")) return SIGUSR2;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case 'V':
|
||||||
|
#ifdef SIGVTALRM
|
||||||
|
if (strEQ(name, "VTALRM")) return SIGVTALRM;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case 'W':
|
||||||
|
#ifdef SIGWINCH
|
||||||
|
if (strEQ(name, "WINCH")) return SIGWINCH;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case 'X':
|
||||||
|
#ifdef SIGXCPU
|
||||||
|
if (strEQ(name, "XCPU")) return SIGXCPU;
|
||||||
|
#endif
|
||||||
|
#ifdef SIGXFSZ
|
||||||
|
if (strEQ(name, "XFSZ")) return SIGXFSZ;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue