Download raw body.
watch(1): wait for child asynchronously
OK?
diff --git watch.c watch.c
index da4f6c0eacf..3b7c917aa36 100644
--- watch.c
+++ watch.c
@@ -73,6 +73,7 @@ int start_line = 0, start_column = 0; /* display offset coordinates */
int pause_status = 0; /* pause status */
time_t lastupdate; /* last updated time */
int xflag = 0;
+pid_t pipe_pid;
#define addwch(_x) addnwstr(&(_x), 1);
#define WCWIDTH(_x) ((wcwidth((_x)) > 0)? wcwidth((_x)) : 1)
@@ -122,6 +123,7 @@ int
main(int argc, char *argv[])
{
struct event ev_sigint, ev_sighup, ev_sigterm, ev_sigwinch, ev_stdin;
+ struct event ev_sigchld;
size_t len, rem;
int i, ch;
char *p;
@@ -209,10 +211,12 @@ main(int argc, char *argv[])
/*
* Initialize signal
*/
+ signal_set(&ev_sigchld, SIGCHLD, on_signal, NULL);
signal_set(&ev_sigint, SIGINT, on_signal, NULL);
signal_set(&ev_sighup, SIGHUP, on_signal, NULL);
signal_set(&ev_sigterm, SIGTERM, on_signal, NULL);
signal_set(&ev_sigwinch, SIGWINCH, on_signal, NULL);
+ signal_add(&ev_sigchld, NULL);
signal_add(&ev_sigint, NULL);
signal_add(&ev_sighup, NULL);
signal_add(&ev_sigterm, NULL);
@@ -374,8 +378,7 @@ void
read_result(BUFFER *buf)
{
FILE *fp;
- int i, st, fds[2];
- pid_t pipe_pid, pid;
+ int i, fds[2];
/* Clear buffer */
memset(buf, 0, sizeof(*buf));
@@ -411,12 +414,7 @@ read_result(BUFFER *buf)
i++)
untabify((*buf)[i], sizeof((*buf)[i]));
fclose(fp);
- do {
- pid = waitpid(pipe_pid, &st, 0);
- } while (pid == -1 && errno == EINTR);
- /* Remember update time */
- time(&lastupdate);
}
kbd_result_t
@@ -644,6 +642,8 @@ void
on_signal(int sig, short event, void *arg)
{
struct winsize ws;
+ int status;
+ pid_t pid;
switch(sig) {
case SIGWINCH:
@@ -652,6 +652,13 @@ on_signal(int sig, short event, void *arg)
doupdate();
display(cur_buf, prev_buf, highlight_mode);
break;
+ case SIGCHLD:
+ pid = waitpid(pipe_pid, &status, WNOHANG);
+ if (pid == pipe_pid) {
+ /* Remember update time */
+ time(&lastupdate);
+ }
+ break;
default:
quit();
}
--
In my defence, I have been left unsupervised.
watch(1): wait for child asynchronously