#include #include #include #include #include #include #include #define DEVICE_PATH "/dev/power" #define BUFFER_SIZE 256 int main() { int fd; fd_set read_fds; struct timeval timeout; char buffer[BUFFER_SIZE]; int ret; fd = open(DEVICE_PATH, O_RDONLY | O_NONBLOCK); if (fd < 0) { perror("open device failed"); return EXIT_FAILURE; } printf("Waiting for data from %s (select mode)...\n", DEVICE_PATH); while (1) { FD_ZERO(&read_fds); FD_SET(fd, &read_fds); timeout.tv_sec = 5; timeout.tv_usec = 0; ret = select(fd + 1, &read_fds, NULL, NULL, &timeout); if (ret < 0) { perror("select error"); close(fd); return EXIT_FAILURE; } else if (ret == 0) { printf("select timeout after 5 seconds, continue waiting...\n"); continue; } if (FD_ISSET(fd, &read_fds)) { memset(buffer, 0, BUFFER_SIZE); ret = read(fd, buffer, BUFFER_SIZE - 1); if (ret < 0) { if (errno != EAGAIN) { perror("read error"); } continue; } else if (ret == 0) { printf("device closed? ret=0\n"); break; } else { printf("Received %d bytes: %s\n", ret, buffer); if (strstr(buffer, "battery") != NULL) { printf(" -> Battery related data\n"); } } } } close(fd); return EXIT_SUCCESS; }