all repos — ryudo @ d1a8d31b45088cf96d31b86ee2e7db14d9279e02

the floatiling window manager that flows; fork of rio from plan9port

key.c: fix zombie terminal processes
Iris Lightshard nilix@nilfm.cc
PGP Signature
-----BEGIN PGP SIGNATURE-----

iQIzBAABCAAdFiEEkFh6dA+k/6CXFXU4O3+8IhROY5gFAmHnTUwACgkQO3+8IhRO
Y5gYJQ/5AZUKJok+JSnhvVcpwd/M4atRBE16muPr8+BtosrfY4zCB7tH3DsAjIjl
kylC2YyWmgUAp8bIDdatqb0M9HOeY5RMz5giQF0sP+38c+f+y/7FPt0QoSZ7iulh
RHfXWYSwBU1yklkMD92lswb6Jl43ejmaCKPGyvplTB2cUniDPWNfVIkH7sW9V87C
9OX99O1QeN1tTkWSxPJDSCjamV0CKYk4zyd/mMajG829WXtGpIyiNmPFEWbHwZ/E
t/zeNnPMhrTvYH0KcV21nJ/KEESeS1Oh1Ak1ngiPFdmx3/9WwFi5qEvGUyyL4N9/
J892Nv0cAnJ1K/QjdXHDeAKm/alud1AjBhR/wnmcQyrZKJAL8HxVkFNi6Q9dp1J2
JVCqxkyqV09Tt19EVgIIWuwyonmBp8D9CmJ5H/0gMhGObhcIMAdOGE9NVBNsoOh+
gl1DhTL9DLkjYTlOls3fn4r4cOKUQuJ/CnFhPXyLDPnAIj6qPir2rCbwUlMXpNIw
Tbgh9EopcwXrPt/Z9wJ225KZ56QrKFPOCdXgYBUNgEc5oyTalQndM4y9yoF2ihMh
GcvnC0dNSjJCjghU/gDlqDQoMsoiiEXpK0025oQDQz61jaKHvvh96oPcFSoUDWKJ
R0l4yiJlJaMPiiIYNpFzy95jHoroKZiZUbviAfcwKJ600GfowQQ=
=KsAa
-----END PGP SIGNATURE-----
commit

d1a8d31b45088cf96d31b86ee2e7db14d9279e02

parent

4d0f0f62daafdba27a5de4c58c925463a2eeede5

1 files changed, 21 insertions(+), 14 deletions(-)

jump to
M key.ckey.c

@@ -6,6 +6,7 @@

#include <stdio.h> #include <stdlib.h> #include <signal.h> +#include <sys/wait.h> #include <X11/X.h> #include <X11/Xos.h> #include <X11/Xlib.h>

@@ -782,22 +783,28 @@ #ifdef LAUNCH_KEY

else if (e->keycode == slcode && (e->state & SHORTCUTMOD) == (MODBITS)) { kbLaunch = 1; if (fork() == 0) { - close(ConnectionNumber(dpy)); - if (dpy != '\0') - putenv(dpy); - signal(SIGINT, SIG_DFL); - signal(SIGTERM, SIG_DFL); - signal(SIGHUP, SIG_DFL); - if (termprog != NULL) { - execl(shell, shell, "-c", termprog, (char*)0); - fprintf(stderr, "ryudo: exec %s", shell); - perror(" failed"); + if (fork() == 0) { + // this code doesn't seem necessary + // close(ConnectionNumber(dpy)); + // if (dpy != '\0') + // putenv(dpy); + signal(SIGINT, SIG_DFL); + signal(SIGTERM, SIG_DFL); + signal(SIGHUP, SIG_DFL); + if (termprog != NULL) { + execl(shell, shell, "-c", termprog, (char*)0); + fprintf(stderr, "ryudo: exec %s", shell); + perror(" failed"); + } + execlp("urxvt", "urxvt", (char*)0); + execlp("9term", "9term", scrolling ? "-ws" : "-w", (char*)0); + execlp("xterm", "xterm", "-ut", (char*)0); + perror("ryudo: exec urxvt/9term/xterm failed"); + exit(1); } - execlp("urxvt", "urxvt", (char*)0); - execlp("9term", "9term", scrolling ? "-ws" : "-w", (char*)0); - execlp("xterm", "xterm", "-ut", (char*)0); - perror("ryudo: exec urxvt/9term/xterm failed"); + exit(0); } + wait((int*)0); } #endif