cuốn sách gpt4 ai đã làm

Cách làm cho read() không bị chặn và đặt lại read()

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 03:33:03 29 4
mua khóa gpt4 Nike

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.

câu trả lời hay nhất

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;
}

Về c - cách làm cho read() không bị chặn và đặt lại read(), chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/34688073/

29 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress