mirror of
https://github.com/janet-lang/janet
synced 2024-12-26 00:10:27 +00:00
Merge pull request #1137 from tionis/master
os/proc-kill now accepts an optional signal to send
This commit is contained in:
commit
c47c2e538d
110
src/core/os.c
110
src/core/os.c
@ -624,12 +624,99 @@ JANET_CORE_FN(os_proc_wait,
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct keyword_signal {
|
||||||
|
const char *keyword;
|
||||||
|
int signal;
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifndef JANET_WINDOWS
|
||||||
|
static const struct keyword_signal signal_keywords[] = {
|
||||||
|
#ifdef SIGKILL
|
||||||
|
{"kill", SIGKILL},
|
||||||
|
#endif
|
||||||
|
{"int", SIGINT},
|
||||||
|
{"abrt", SIGABRT},
|
||||||
|
{"fpe", SIGFPE},
|
||||||
|
{"ill", SIGILL},
|
||||||
|
{"segv", SIGSEGV},
|
||||||
|
#ifdef SIGTERM
|
||||||
|
{"term", SIGTERM},
|
||||||
|
#endif
|
||||||
|
#ifdef SIGARLM
|
||||||
|
{"alrm", SIGALRM},
|
||||||
|
#endif
|
||||||
|
#ifdef SIGHUP
|
||||||
|
{"hup", SIGHUP},
|
||||||
|
#endif
|
||||||
|
#ifdef SIGPIPE
|
||||||
|
{"pipe", SIGPIPE},
|
||||||
|
#endif
|
||||||
|
#ifdef SIGQUIT
|
||||||
|
{"quit", SIGQUIT},
|
||||||
|
#endif
|
||||||
|
#ifdef SIGUSR1
|
||||||
|
{"usr1", SIGUSR1},
|
||||||
|
#endif
|
||||||
|
#ifdef SIGUSR2
|
||||||
|
{"usr2", SIGUSR2},
|
||||||
|
#endif
|
||||||
|
#ifdef SIGCHLD
|
||||||
|
{"chld", SIGCHLD},
|
||||||
|
#endif
|
||||||
|
#ifdef SIGCONT
|
||||||
|
{"cont", SIGCONT},
|
||||||
|
#endif
|
||||||
|
#ifdef SIGSTOP
|
||||||
|
{"stop", SIGSTOP},
|
||||||
|
#endif
|
||||||
|
#ifdef SIGTSTP
|
||||||
|
{"tstp", SIGTSTP},
|
||||||
|
#endif
|
||||||
|
#ifdef SIGTTIN
|
||||||
|
{"ttin", SIGTTIN},
|
||||||
|
#endif
|
||||||
|
#ifdef SIGTTOU
|
||||||
|
{"ttou", SIGTTOU},
|
||||||
|
#endif
|
||||||
|
#ifdef SIGBUS
|
||||||
|
{"bus", SIGBUS},
|
||||||
|
#endif
|
||||||
|
#ifdef SIGPOLL
|
||||||
|
{"poll", SIGPOLL},
|
||||||
|
#endif
|
||||||
|
#ifdef SIGPROF
|
||||||
|
{"prof", SIGPROF},
|
||||||
|
#endif
|
||||||
|
#ifdef SIGSYS
|
||||||
|
{"sys", SIGSYS},
|
||||||
|
#endif
|
||||||
|
#ifdef SIGTRAP
|
||||||
|
{"trap", SIGTRAP},
|
||||||
|
#endif
|
||||||
|
#ifdef SIGURG
|
||||||
|
{"urg", SIGURG},
|
||||||
|
#endif
|
||||||
|
#ifdef SIGVTALRM
|
||||||
|
{"vtlarm", SIGVTALRM},
|
||||||
|
#endif
|
||||||
|
#ifdef SIGXCPU
|
||||||
|
{"xcpu", SIGXCPU},
|
||||||
|
#endif
|
||||||
|
#ifdef SIGXFSZ
|
||||||
|
{"xfsz", SIGXFSZ},
|
||||||
|
#endif
|
||||||
|
{NULL, 0},
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
JANET_CORE_FN(os_proc_kill,
|
JANET_CORE_FN(os_proc_kill,
|
||||||
"(os/proc-kill proc &opt wait)",
|
"(os/proc-kill proc &opt wait signal)",
|
||||||
"Kill a subprocess by sending SIGKILL to it on posix systems, or by closing the process "
|
"Kill a subprocess by sending SIGKILL to it on posix systems, or by closing the process "
|
||||||
"handle on windows. If `wait` is truthy, will wait for the process to finish and "
|
"handle on windows. If `wait` is truthy, will wait for the process to finish and "
|
||||||
"returns the exit code. Otherwise, returns `proc`.") {
|
"returns the exit code. Otherwise, returns `proc`. If signal is specified send it instead."
|
||||||
janet_arity(argc, 1, 2);
|
"Signal keywords are named after their C counterparts but in lowercase with the leading "
|
||||||
|
"`SIG` stripped. Signals are ignored on windows.") {
|
||||||
|
janet_arity(argc, 1, 3);
|
||||||
JanetProc *proc = janet_getabstract(argv, 0, &ProcAT);
|
JanetProc *proc = janet_getabstract(argv, 0, &ProcAT);
|
||||||
if (proc->flags & JANET_PROC_WAITED) {
|
if (proc->flags & JANET_PROC_WAITED) {
|
||||||
janet_panicf("cannot kill process that has already finished");
|
janet_panicf("cannot kill process that has already finished");
|
||||||
@ -643,7 +730,22 @@ JANET_CORE_FN(os_proc_kill,
|
|||||||
CloseHandle(proc->pHandle);
|
CloseHandle(proc->pHandle);
|
||||||
CloseHandle(proc->tHandle);
|
CloseHandle(proc->tHandle);
|
||||||
#else
|
#else
|
||||||
int status = kill(proc->pid, SIGKILL);
|
int signal = -1;
|
||||||
|
if (argc == 3) {
|
||||||
|
JanetKeyword signal_kw = janet_getkeyword(argv, 2);
|
||||||
|
const struct keyword_signal *ptr = signal_keywords;
|
||||||
|
while (ptr->keyword) {
|
||||||
|
if (!janet_cstrcmp(signal_kw, ptr->keyword)) {
|
||||||
|
signal = ptr->signal;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ptr++;
|
||||||
|
}
|
||||||
|
if (signal == -1) {
|
||||||
|
janet_panic("undefined signal");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int status = kill(proc->pid, signal == -1 ? SIGKILL : signal);
|
||||||
if (status) {
|
if (status) {
|
||||||
janet_panic(strerror(errno));
|
janet_panic(strerror(errno));
|
||||||
}
|
}
|
||||||
|
@ -52,6 +52,11 @@
|
|||||||
(def retval (os/proc-wait p))
|
(def retval (os/proc-wait p))
|
||||||
(assert (not= retval 24) "Process was *not* terminated by parent"))
|
(assert (not= retval 24) "Process was *not* terminated by parent"))
|
||||||
|
|
||||||
|
(let [p (os/spawn [janet "-e" `(do (ev/sleep 30) (os/exit 24)`] :p)]
|
||||||
|
(os/proc-kill p false :term)
|
||||||
|
(def retval (os/proc-wait p))
|
||||||
|
(assert (not= retval 24) "Process was *not* terminated by parent"))
|
||||||
|
|
||||||
# Parallel subprocesses
|
# Parallel subprocesses
|
||||||
|
|
||||||
(defn calc-1
|
(defn calc-1
|
||||||
|
Loading…
Reference in New Issue
Block a user