#include #include #include #include #define LEN(a) (sizeof(a) / sizeof(a[0])) #define MAX_MSG_LEN 100 typedef struct { unsigned int t; char* msg; } Timers; static Timers timers[] = { { 2400, "Time to start working!" }, { 600, "Time to start resting!" }, { 2400, "Time to start working!" }, { 600, "Time to start resting!" }, { 2400, "Time to start working!" }, { 600, "Time to start resting!" }, { 2400, "Time to start working!" }, { 1800, "Time to take a longer rest!" }, }; void spawn(char* argv[]) { if (fork() == 0) { // we need to fork the process so that // when we exit the sent screen // this program continues. setsid(); execvp(argv[0], argv); perror(" failed"); exit(0); } } void print_time_now() { time_t timer; char buffer[26]; struct tm* tm_info; timer = time(NULL); tm_info = localtime(&timer); strftime(buffer, 26, "%Y-%m-%d %H:%M:%S", tm_info); fprintf(stderr, "%s", buffer); } void display_message(char* msg) { char sh_command[MAX_MSG_LEN]; snprintf(sh_command, MAX_MSG_LEN, "echo '%s' | sent", msg); // NOLINT: We are being carefull here by considering MAX_MSG_LEN explicitly. printf("%s", sh_command); char* spawn_args[] = { "/bin/sh", "-c", sh_command, NULL }; spawn(spawn_args); print_time_now(); fprintf(stderr, " | %s\n", msg); } int main(int argc, char* argv[]) { for (int i = 0;; i = (i + 1) % LEN(timers)) { display_message(timers[i].msg); sleep(timers[i].t); } }