Позвоните gettimeofday
перед входом в цикл и запомните время Внутри цикла постоянно вызывайте gettimeofday
и вычисляйте разницу между текущим временем и началом Когда разница будет достаточно большой, вырвитесь из цикла.
По сути, что-то вроде этого:
struct timeval tv_begin, tv_current;
gettimeofday(&tv_begin, NULL);
for (;;) {
gettimeofday(&tv_current, NULL);
unsigned long long diff =
(tv_current.tv_sec * 1000000 + tv_current.tv_usec) -
(tv_begin.tv_sec * 1000000 + tv_begin.tv_usec);
if (diff > TIMEOUT)
break;
}