#c #time #sleep
#c #время #сон
Вопрос:
Я хочу перевести свою программу в спящий режим на некоторое желаемое время. но я также хочу, чтобы при нажатии enter программа просыпалась.
clock_t t;
int sleep_time=10;
t=clock();
while(1){
int temp=clock()-t;
double time_now=(double)(temp)/CLOCKS_PER_SEC;
if(time_now>=sleep_time){
break;
}
if(getchar()=='n'){
break;
}
}
но эта программа будет ждать ввода, и если ввод не задан, он не сломается
Как я могу это сделать.
Комментарии:
1. Используйте
sleep()
, вот ссылка для этого linux.die.net/man/3/sleep2. В системах posix, таких как Linux, вы можете использовать select для ожидания доступности ввода.
select
также имеет тайм-аут. Вызовselect
переведет процесс в спящий режим до тех пор, пока не будет доступен ввод или не истечет время ожидания (на самом деле, есть также случай прерывания сигнала).
Ответ №1:
На платформе POSIX вы можете использовать select()
/ poll()
при стандартном вводе и с параметром тайм-аута:
#include <sys/select.h>
#include <unistd.h>
int main(void)
{
fd_set inp; FD_ZERO(amp;inp); FD_SET(STDIN_FILENO,amp;inp);
select(1,amp;inp,0,0,amp;(struct timeval){.tv_sec=1});
}
При включенных обработчиках сигналов вам также нужно будет следить EINTR
и повторять запрос с оставшимся временем.
К сожалению, вы не можете рассчитывать ни на то select()
, ни poll()
на то, чтобы предоставить вам оставшееся время ( select
может и будет в Linux, через struct timeval*
параметр, но поведение не переносимо), поэтому вам нужно будет использовать clock_gettime
его для вычисления самостоятельно.