Совершенно неожиданно у меня возник вопрос, а как ПРАВИЛЬНО(!) написать простейшую консольную программку-часы на голом цэ.
Есть два варианта, оба работают, однако есть пара вопросов.
Вариант №1.
Код: Выделить всё
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
void update_clock()
{
char buf_time[40];
struct timeval time_clock;
gettimeofday(&time_clock, 0);
strftime(buf_time, sizeof(buf_time), "%H:%M:%S", localtime(&time_clock.tv_sec));
printf("%s\n", buf_time);
}
int main()
{
fd_set fd;
struct timeval tv;
time_t now;
struct tm *lt;
update_clock();
while(1)
{
now = time(0);
lt = gmtime(&now);
tv.tv_usec = 0;
tv.tv_sec = 60 - lt->tm_sec;
FD_ZERO(&fd);
FD_SET(0, &fd);
if(select(1, &fd, 0, 0, &tv) == 0) update_clock();
}
return 0;
}
Ровно раз в минуту, как и ожидается, синхронно с часами в lxpanel, выводится время, это именно то, что мне и нужно.
Вариант №2.
Код: Выделить всё
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <sys/time.h>
void update_clock()
{
char buf_time[40];
struct timeval time_clock;
gettimeofday(&time_clock, 0);
strftime(buf_time, sizeof(buf_time), "%H:%M:%S", localtime(&time_clock.tv_sec));
printf("%s\n", buf_time);
}
int main()
{
while(1)
{
update_clock();
sleep(1);
}
return 0;
}
Тоже работает.
Так что лучше, какой вариант, критерий оценки = наименьшая нагрузка на камень и наименьший расход ресурсов.
Ну и пара вопросов:
Q1: Есть ли другие варианты, при условии, что это будет голый цэ, а еще лучше голые syscall'ы + asm?
Задача вывод точного времени, не просто раз в минуту, а синхронно с системными часами, т.е. было 12:30, и вдруг раз и стало 12:31, как правильно поймать это событие?
Q2: Как бы выщелкнуть цикл проверки и печати в отдельный процесс/нить?
Задача проста, есть цикл главной программы и он НИЧЕГО не делает, кроме как проверяет, а не завис ли дочерний процесс/нить и если завис, то убить его и запустить заново.
Что лучше/правильнее fork() или pthread_create().
Насколько я понимаю, fork() запускает дочерний процесс как абсолютную копию родительского, за исключением другого PID, можно ли запустить дочерний процесс и заставить его выполнять ТОЛЬКО одну задачу/функцию (НЕ отдельный бинарь, а именно процесс/нить), которую родительский процесс НЕ выполняет, ну например печать системного времени. Или спецом для таких задач и придуман pthread_create()?
В псевдо коде это что то типа:
Код: Выделить всё
main()
{
fork() / pthread_create(): update_clock();
while(1)
{
if(!проверка_дочернего_процесса/нити())
// процесс/нить не отвечает == завис
kill(): update_clock();
restart(): update_clock();
}
return 0;
}
Я вообще туда копаю или есть более простые решения?