【发布时间】:2026-02-12 12:55:02
【问题描述】:
我正在尝试模拟命令行 shell。用户输入他们想要输入的 shell 命令,例如/bin/pwd 和代码是为了执行它。
缓冲区设置为读取固定数量的字符(例如 20 个)。
如果用户输入超过 20 个字符,则需要在 shell 再次循环之前刷新多余的字符。
我一直在尝试这样做:
int garbageCollector;
while ((garbageCollector = getchar()) != '\n' && garbageCollector != EOF);
但问题是getChar()要求你先输入一个字符。
有没有一种不需要用户输入任何内容来刷新标准输入的方法?
while (1) {
// Prompt user for input
ssize_t readIn = read(STDIN_FILENO, buffer, BUF_SIZE + 1);
if (readIn < 0) {
perror("read() failed");
return 2;
}
// Null-terminate and remove line return
buffer[readIn - 1] = '\0';
char program[strlen(buffer)];
strcpy(program, buffer);
printf("program is: %s\n", program);
// Flush stdin
int garbageCollector;
while ((garbageCollector = getchar()) != '\n' && garbageCollector != EOF);
// Create child process
child = fork();
if (child < 0) {
perror("fork() failed");
return 3;
}
// Start alarm that is triggered after timeout exceeded
// which then kills child process
signal(SIGALRM, killChild);
alarm(timeout);
if (child == 0) { // Child
char* av[] = { program, NULL };
execve(program, av, NULL);
} else { // Parent
wait(NULL);
alarm(0); // Reset alarm if program executed
}
memset(buffer, 0, BUF_SIZE); // Flush buffer
}
【问题讨论】:
-
请注意,20 个字符的命令行在中期是不可行的——它太短了。 2000 个字符,也许你会在竞选中。
-
像 Bash 这样的 Shell 将终端置于非规范模式并使用该模式读取 - 不使用标准 I/O 函数。它更类似于使用 Curses 库。
-
是的,20 个字符只是一个例子。如何在没有标准 I/O 功能的情况下刷新缓冲区?