Vì vậy tôi đã tạo ra chức năng này, nó giống như đếm ngược. Tôi muốn đọc lệnh khi đếm ngược giảm. Vấn đề lớn của tôi là nhận được read()
Đợi đầu vào trong khi đếm ngược giảm. Như bạn có thể thấy, tôi đã thử sử dụng lựa chọn()
nhưng trong lần đầu tiên sau printf("timeout.\n");
Nó ngừng cố gắng đọc. Tôi chỉ làm được một lầnhết giờ
, nếu không nó sẽ tiếp tục cho đến khi đếm ngược về 0. Tôi cần thử đọc lại.
bộ đếm thời gian int (int giây)
{
thời gian_t bắt đầu, kết thúc;
gấp đôi trôi qua;
int đã mở=0;
lệnh char[10];
cấu trúc truyền hình thời gian;
int fd_stdin,rv;
fd_setrd;
fd_stdin=fileno(stdin);
FD_ZERO(&rd);
FD_SET(fileno(stdin),&rd);
tv.tv_sec=5;
tv.tv_usec=0;
time(&start); /* bắt đầu tính giờ */
do
{
thời gian(&kết thúc);
đã trôi qua = thời gian khác biệt (kết thúc, bắt đầu);
if(fmod(đã trôi qua,5)==0)
{
printf("Thời gian còn lại: %f phút.\n", (giây trôi qua)/60);
ngủ(1);
nếu(đã mở==0)
{
printf("Sử dụng opentest để mở bài kiểm tra của bạn.\n");
đã mở=1;
}
fflush(stdout);
}
int c;
rv=select(fd_stdin+1,&rd,NULL,NULL,&tv);
nếu(rv==-1)
{
perror("Lỗi khi chọn.\n");
exit(1);
}
khác nếu (rv==0 && c!=1)
{
printf("timeout.\n");
rv=select(fd_stdin+1,&rd,NULL,NULL,&tv);
c=1;
}
khác
{
c=0;
đọc(fd_stdin,lệnh,10);
}
}
while(đã trôi qua < giây);
return 0;
}
CHỈNH SỬA: Để sử dụngfmod()
chức năng, tôi biên dịch nó như thế này:gcc client.c -lm -o client.exe
. Tôi không nghĩ đây là vấn đề, nhưng tôi không chắc chắn.
lựa chọn()
Sửa đổi khi thoát fd_set
Để phản ánh những mô tả nào đã được báo hiệu. Bạn không đặt lại sau mỗi lần hết thời gian chờ fd_set
.
Ngoài ra, trên một số nền tảng,lựa chọn()
sẽ được sửa đổi khoảng thời gian
struct để phản ánh thời gian còn lại, vì vậy bạn phải đặt lại khoảng thời gian
mỗi khi nó được gọi trên các nền tảng này lựa chọn()
giờ.
Ngoài ra, của bạn c
Các biến được khai báo bên trong vòng lặp và không được khởi tạo. Thay vào đó, hãy di chuyển nó ra khỏi vòng lặp.
Hãy thử một cái gì đó giống như thế này:
bộ đếm thời gian int (int giây)
{
thời gian_t bắt đầu, kết thúc;
gấp đôi trôi qua;
int đã mở = 0;
lệnh char[10];
cấu trúc truyền hình thời gian;
int fd_stdin, rv;
fd_setrd;
int c = 0;
fd_stdin = fileno(stdin);
time(&start); /* bắt đầu tính giờ */
do
{
thời gian(&kết thúc);
đã trôi qua = thời gian khác biệt (kết thúc, bắt đầu);
if (fmod(đã trôi qua, 5) == 0)
{
printf("Thời gian còn lại: %f phút.\n", (giây trôi qua)/60);
ngủ(1);
nếu (đã mở == 0)
{
printf("Sử dụng opentest để mở bài kiểm tra của bạn.\n");
đã mở = 1;
}
fflush(stdout);
}
FD_ZERO(&rd);
FD_SET(fd_stdin, &rd);
tv.tv_sec = 5;
tv.tv_usec = 0;
rv = select(fd_stdin+1, &rd, NULL, NULL, &tv);
nếu (rv == -1)
{
perror("Lỗi khi chọn.\n");
exit(1);
}
khác nếu (rv == 0)
{
nếu (c != 1)
{
printf("timeout.\n");
c = 1;
}
}
khác
{
c = 0;
đọc(fd_stdin, lệnh, 10);
}
}
trong khi (đã trôi qua < giây);
return 0;
}
Tôi là một lập trình viên xuất sắc, rất giỏi!