aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--module-test/self_pipe.c51
1 files changed, 39 insertions, 12 deletions
diff --git a/module-test/self_pipe.c b/module-test/self_pipe.c
index ae271c3..38c8fb9 100644
--- a/module-test/self_pipe.c
+++ b/module-test/self_pipe.c
@@ -8,10 +8,14 @@
-o module-test/self_pipe.out
*/
+#define _GNU_SOURCE
+
#include <stdio.h>
#include <sys/select.h>
#include <unistd.h>
#include <signal.h>
+#include <poll.h>
+#include <errno.h>
#define TMP_SIZE 1024
@@ -19,7 +23,10 @@
typedef void handler_t(int);
handler_t *Signal(int signum, handler_t *handler);
void sigusr1_handler(int signum);
+void sigusr2_handler(int signum);
int my_read(char *s, int len);
+int my_poll(struct pollfd fds[], nfds_t nfds);
+
int self_pipe_fd[2] = {-1, -1};
@@ -31,25 +38,45 @@ void sigusr1_handler(int signum)
write(self_pipe_fd[1], &tmp, 1);
}
+void sigusr2_handler(int signum) { /* empty */ }
+
+int my_poll(struct pollfd fds[], nfds_t nfds)
+{
+ while (true)
+ {
+ int ret = poll(fds, nfds, -1);
+ // if not signal'd
+ if (!(ret == -1 && errno == EINTR))
+ return ret;
+ }
+}
+
int my_read(char *s, int len)
{
int max_fd;
if (STDIN_FILENO > self_pipe_fd[0]) max_fd = STDIN_FILENO;
else max_fd = self_pipe_fd[0];
- fd_set rset;
- FD_ZERO(&rset);
- FD_SET(STDIN_FILENO, &rset);
- FD_SET(self_pipe_fd[0], &rset);
- select(max_fd+1, &rset, nullptr, nullptr, nullptr);
- if (FD_ISSET(self_pipe_fd[0], &rset))
+
+ struct pollfd fds[2];
+
+ fds[0].fd = STDIN_FILENO;
+ fds[0].events = POLLIN;
+
+ fds[1].fd = self_pipe_fd[0];
+ fds[1].events = POLLIN;
+
+ my_poll(fds, 2);
+
+ if ((fds[0].revents) & POLLIN) // stdin
{
- return read(self_pipe_fd[0], s, len);
+ return read(STDIN_FILENO, s, len);
}
- else if (FD_ISSET(STDIN_FILENO, &rset))
+ else if ((fds[1].revents) & POLLIN) // pipe
{
- return read(STDIN_FILENO, s, len);
+ return read(self_pipe_fd[0], s, len);
}
- return -1;
+
+ return -2;
}
@@ -65,10 +92,10 @@ handler_t *Signal(int signum, handler_t *handler)
return (old_action.sa_handler);
}
-int main()
+int main(int argc, char **argv)
{
- printf("Do not enter anything\n");
Signal(SIGUSR1, sigusr1_handler);
+ Signal(SIGUSR2, sigusr2_handler);
pipe(self_pipe_fd);
int pid = getpid();
printf("Running PID: %d\n", pid);