]> prime8.dev >> repos - ttyd.git/commitdiff
protocol: cleanup process without hanging
authorShuanglei Tao <tsl0922@gmail.com>
Sat, 11 May 2019 01:48:16 +0000 (09:48 +0800)
committerShuanglei Tao <tsl0922@gmail.com>
Sat, 11 May 2019 02:05:51 +0000 (10:05 +0800)
src/protocol.c
src/server.c
src/utils.c
src/utils.h

index b3f9a33c6cce6c59bf1e24eaa995e99a3acd0f66..dab0d3a2f20e5c6f6619b73dd910f15efb2607e2 100644 (file)
@@ -9,7 +9,6 @@
 #include <sys/queue.h>
 #include <sys/select.h>
 #include <sys/types.h>
-#include <sys/wait.h>
 #include <pthread.h>
 
 #if defined(__OpenBSD__) || defined(__APPLE__)
@@ -148,10 +147,11 @@ tty_client_destroy(struct tty_client *client) {
     if (kill(pid, server->sig_code) != 0) {
         lwsl_err("kill: %d, errno: %d (%s)\n", pid, errno, strerror(errno));
     }
-    int status;
-    while (waitpid(client->pid, &status, 0) == -1 && errno == EINTR)
-        ;
-    lwsl_notice("process exited with code %d, pid: %d\n", status, client->pid);
+    pid_t pid_out;
+    int status = wait_proc(client->pid, &pid_out);
+    if (pid_out > 0) {
+        lwsl_notice("process exited with code %d, pid: %d\n", status, pid_out);
+    }
     close(client->pty);
 
 cleanup:
index 413d9b9166294132d8f45b449e68deccb574e8de..73c07ab661dcc6ce5dbbc36c88fe20fedf15248a 100644 (file)
@@ -181,6 +181,15 @@ sig_handler(int sig) {
     lwsl_notice("send ^C to force exit.\n");
 }
 
+void
+sigchld_handler() {
+    pid_t pid;
+    int status = wait_proc(-1, &pid);
+    if (pid > 0) {
+        lwsl_notice("process exited with code %d, pid: %d\n", status, pid);
+    }
+}
+
 int
 calc_command_start(int argc, char **argv) {
     // make a copy of argc and argv
@@ -456,6 +465,7 @@ main(int argc, char **argv) {
 
     signal(SIGINT, sig_handler);  // ^C
     signal(SIGTERM, sig_handler); // kill
+    signal(SIGCHLD, sigchld_handler);
 
     context = lws_create_context(&info);
     if (context == NULL) {
index c4330ef9fe631e89aa953225f9216c6e598cd258..680518c491ce50e3b570f0405b3d948be131d9c2 100644 (file)
@@ -4,6 +4,8 @@
 #include <ctype.h>
 #include <string.h>
 #include <signal.h>
+#include <sys/errno.h>
+#include <sys/wait.h>
 
 #ifdef __linux__
 // https://github.com/karelzak/util-linux/blob/master/misc-utils/kill.c
@@ -83,6 +85,22 @@ get_sig(const char *sig_name) {
     return atoi(sig_name);
 }
 
+int
+wait_proc(pid_t in, pid_t *out) {
+    int stat = 0, pid;
+    do {
+        pid = waitpid(in, &stat, WNOHANG);
+    } while (pid < 0 && errno == EINTR);
+    if (out != NULL) *out = pid;
+    int status  = -1;
+    if (WIFEXITED(stat)) {
+        status = WEXITSTATUS(stat);
+    } else if (WIFSIGNALED(status)) {
+        status = WTERMSIG(stat);
+    }
+    return status;
+}
+
 int
 open_uri(char *uri) {
 #ifdef __APPLE__
index 1781c6a2fef09de7eaf4d0436e4e62bd01003067..72cfce2d152451889c01feca95ee6f43888cd594 100644 (file)
@@ -25,6 +25,10 @@ get_sig_name(int sig, char *buf, size_t len);
 int
 get_sig(const char *sig_name);
 
+// waitpid with WNOHANG and return the status
+int
+wait_proc(pid_t in, pid_t *out);
+
 // Open uri with the default application of system
 int
 open_uri(char *uri);