From 111272567f63e4e5faf5a8e5b518c4e68d9d96bf Mon Sep 17 00:00:00 2001 From: _ov4 Date: Mon, 2 Nov 2026 03:17:09 +0000 Subject: use poll(2) --- module-test/self_pipe.c | 51 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 12 deletions(-) (limited to 'module-test/self_pipe.c') 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 #include #include #include +#include +#include #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); -- cgit v1.3.1-4-g156e