fgets STDIN_FILENO
时间: 2023-10-06 13:12:20 浏览: 68
STDIN_FILENO是一个文件描述符,它代表标准输入流。而fgets()函数是用于从文件中读取一行数据的函数,它的参数中需要传入一个字符指针来存储读取到的数据。所以,你不能直接将STDIN_FILENO作为fgets()函数的参数。
如果你想使用fgets()函数从标准输入流中读取数据,你可以简单地将stdin作为参数传递给fgets()函数,就像这样:fgets(buf, sizeof(buf), stdin); 这里的stdin是一个FILE*类型的标准输入流指针,它对应于STDIN_FILENO。
相关问题
尝试编写 fgets 函数的一个新版本 tfgets的代码——tfgets 函数的输入与 fgets 函数一致。 完成以下任务(1) tfgets 函数可设定一个超时时限,比如 10 秒,即用户如果不在 10 秒内键入一个正确的输入行,则 tfgets 返回一个警告提示信息; 否则 tfgets 返回一个指针,该指针指向用户键入的输入行; (2) 用户键入的信息需要与预设信息一致,即视为正确输入,可以 给出相关提示,让用户猜测应该输入什么(不得直接给出答案)
以下是 tfgets 函数的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <termios.h>
#define TIMEOUT 10 // 超时时间为 10 秒
char *tfgets(char *str, int n, const char *predefined) {
struct termios oldt, newt;
int c, i = 0;
time_t start = time(NULL);
printf("Please enter: %s\n", predefined);
tcgetattr(STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
while (1) {
if (time(NULL) - start > TIMEOUT) { // 超时处理
printf("\nTime out, please try again.\n");
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
return NULL;
}
if (i == n - 1) break; // 达到输入长度限制
if (read(STDIN_FILENO, &c, 1) > 0) {
if (c == 127 || c == 8) { // 处理退格键
if (i > 0) {
i--;
printf("\b \b");
}
} else if (c == '\n' || c == '\r') { // 处理回车键
str[i] = '\0';
printf("\n");
break;
} else { // 处理其他键
str[i] = c;
i++;
printf("*");
}
}
}
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
if (strcmp(str, predefined) == 0) { // 预设信息匹配
printf("You entered the correct answer!\n");
return str;
} else {
printf("Sorry, your answer is incorrect.\n");
return NULL;
}
}
```
tfgets 函数的输入与 fgets 函数一致,包括输入缓冲区、缓冲区大小和文件指针等参数。函数中使用了 termios 库来控制终端的属性,从而实现关闭回显和规范模式。tfgets 函数使用了一个 while 循环来读取用户输入,如果输入超时,则返回空指针;如果输入达到长度限制,则退出循环,将输入缓冲区中的最后一个字符设置为 '\0'。最后,tfgets 函数会将用户输入与预设信息进行比较,如果匹配,则返回输入缓冲区的指针,否则返回空指针。函数中使用了 printf 函数来输出提示信息,避免了直接给出答案的情况。
Linux epoll编程示例
以下是一个简单的Linux epoll编程示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/epoll.h>
#define MAX_EVENTS 10
int main() {
int epoll_fd, num_events;
struct epoll_event events[MAX_EVENTS];
// 创建epoll实例
epoll_fd = epoll_create1(0);
if (epoll_fd == -1) {
perror("epoll_create1");
exit(EXIT_FAILURE);
}
// 添加文件描述符到epoll实例中
struct epoll_event event;
event.events = EPOLLIN;
event.data.fd = STDIN_FILENO;
if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, STDIN_FILENO, &event) == -1) {
perror("epoll_ctl");
exit(EXIT_FAILURE);
}
// 等待事件发生
while (1) {
num_events = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);
if (num_events == -1) {
perror("epoll_wait");
exit(EXIT_FAILURE);
}
// 处理事件
for (int i = 0; i < num_events; i++) if (events[i].data.fd == STDIN_FILENO) {
printf("Input event occurred\n");
char buffer[256];
fgets(buffer, sizeof(buffer), stdin);
printf("Input: %s", buffer);
}
}
}
// 关闭epoll实例
close(epoll_fd);
return 0;
}
```
该示例演示了如何使用epoll实现对标准输入的监听。当有输入事件发生时,程序会打印输入的内容。
相关推荐
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)