Вы можете делать то, что хотите, установив будильник для прерывания системного вызова. Вам нужна базовая настройка где-то в основном или в начале процесса инициализации программы:
#include <signal.h>
sig_atomic_t alarm_counter;
void alarm_handler(int signal) {
alarm_counter++;
}
void setup_alarm_handler() {
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
sa.sa_handler = alarm_handler;
sa.flags = 0;
if (sigaction(SIGALRM, &sa, 0) < 0)
die("Can't establish signal handler");
}
// call setup_alarm_handler in main
Затем вы можете использовать его как:
alarm(10); // set a 10 second timeout
(len = connect(mysocket, &sock_dest, sizeof(struct sockaddr))) < 0 ||
(len = read(mysocket, buffer, 10));
alarm(0); // cancel alarm if it hasn't happened yet
if (len == -1 && errno == EINTR)
// timed out before any data read
else if (len == -1)
// other error
Таким образом, вы можете иметь тайм-аут для последовательности вызовов (это будет тайм-аут, если соединение или чтение занимает слишком много времени по отдельности или в целом), вместо того, чтобы выяснять, сколько времени занял каждый вызов, так что вы знаете, сколько ждать каждого последующего звонка.