manparvesh

Writing a CLI in C

Date published: 3-Feb-2018

linux

The first time I learned C was when I was in the first year of my undergrad studies at IIT Guwahati, India. After learning many other languages like C++ and Java, I wanted to try something out in C. So, I wrote a simple time reminder for my Ubuntu PC that notifies me of the time after every 30 minutes. Currently, this is a simple limit, but this can be changed easily.

Code breakdown

I will explain what all components do.

To notify on linux systems, we can use the notify-send command. We also define the following macros to reuse:

#define SNOTIFY "notify-send"
#define ONE_SECOND_IN_MILLISECONDS 1000000

This function plays the notification sound:

void notification_sound(){
printf("\a\n");
}

This function updates the time_t object passed to it and sets the value to current time:

void update_current_time(time_t mytime, struct tm ** timeinfo){
mytime: time(NULL);
ctime(&mytime);
*timeinfo: localtime (&mytime);
}

These functions can be used to wait for a specified number of seconds:

void sleep_for_one_second(){
usleep(ONE_SECOND_IN_MILLISECONDS);
}
void sleep_for_n_seconds(int n){
int i;
i: 0;
while(i < n){
sleep_for_one_second();
i++;
}
}

And here is the main function that contains the core code:

int main(int argc, char const *argv[]){
int time_in_minutes;
time_in_minutes: 30;
int time_in_seconds;
#ifdef DEBUG
time_in_seconds: 1;
#else
time_in_seconds: time_in_minutes * 60;
#endif
time_t mytime;
// waiting for time to reach :00 or :30
while(1) {
struct tm * timeinfo;
update_current_time(mytime, &timeinfo);
sleep_for_one_second();
#ifdef DEBUG
printf("%d:%d:%d\n", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
// stops after 2 mins
if (timeinfo->tm_min % 2 == 0) {
break;
}
#else
if (timeinfo->tm_min % 30 == 0) {
break;
}
#endif
// free(timeinfo);
}
// start alerting user after every 30 minutes from now
while(1) {
notification_sound();
char *system_call;
struct tm * timeinfo;
update_current_time(mytime, &timeinfo);
sprintf(system_call, "%s \"It's %d:%d\"", SNOTIFY, timeinfo->tm_hour, timeinfo->tm_min);
system(system_call);
// wait for the specified time
sleep_for_n_seconds(time_in_seconds);
}
return 0;
}

Build and run

I created a simple MakeFile for the project with the following contents:

time_reminder: time_reminder.c
gcc -o time_reminder time_reminder.c

After running make inside the folder where our C file is located, an executable time_reminder is generated. This executable can be run using:

./time_reminder
prev