我正在尝试模拟命令行shell。用户输入他们想要执行的shell命令,例如
缓冲区被设置为读取一定数量的字符(比如说20个)。
如果用户输入的字符数超过20个,多余的字符需要在shell循环之前被清除。
我一直在尝试这样做:
/bin/pwd
,代码会执行它。缓冲区被设置为读取一定数量的字符(比如说20个)。
如果用户输入的字符数超过20个,多余的字符需要在shell循环之前被清除。
我一直在尝试这样做:
int garbageCollector;
while ((garbageCollector = getchar()) != '\n' && garbageCollector != EOF);
但问题在于getChar()
需要您先输入一个字符。
有没有一种不需要用户输入任何内容就可以清空stdin的方法?
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
}