用C语言构建简单Shell:系统编程初学者指南

我如何用C语言构建简单Shell——系统编程初学者指南 (1/3)
#cli #c #systemprogramming #memorymanagement
第1部分:在自定义Shell中读取用户输入(C编程)
在我的自定义shell项目的这一部分中,我将解释如何在C中动态读取用户输入。在shell环境中正确处理用户输入是至关重要的,因为命令的长度可能不同。我没有使用固定大小的缓冲区,而是实现了动态内存分配方法以获得更好的灵活性。
理解 _read_command_ 函数
read_command() 函数负责:
动态读取用户输入
处理内存分配和重新分配以避免缓冲区溢出
确保输入字符串的正确终止
代码分解
  1. #ifndef READ_COMMAND_H
  2. #define READ_COMMAND_H

  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>

  6. #define INT_BUFFER_SIZE 32 // 初始缓冲区大小

  7. char *read_command();

  8. #endif
头文件保护 (#ifndef READ_COMMAND_H): 防止多次包含。
常量定义 (INT_BUFFER_SIZE): 设置输入存储的初始缓冲区大小。
_read_command()_ 的实现
  1. char *read_command()
  2. {
  3. char *command = malloc(INT_BUFFER_SIZE * sizeof(char));
  4. if (!command)
  5. {
  6. perror("Memory allocation failed");
  7. exit(EXIT_FAILURE);
  8. }
内存分配 (malloc): 最初为存储用户输入分配 INT_BUFFER_SIZE 字节。
错误处理: 如果 malloc 失败,程序打印错误并退出。
  1. int size = INT_BUFFER_SIZE;
  2. int length = 0;
  3. int c;
size: 跟踪当前缓冲区大小。
length: 跟踪实际读取的字符数。
c: 存储从 _getchar()_ 获取的输入字符。
处理动态输入增长
  1. while ((c = getchar()) != '\n' && c != EOF)
  2. {
  3. if (length >= (size - 1))
  4. {
  5. size *= 2; // 需要时将缓冲区大小加倍
  6. char *new_command = realloc(command, (size + 1));
  7. if (!new_command)
  8. {
  9. free(command);
  10. perror("Memory reallocation failed");
  11. exit(EXIT_FAILURE);
  12. }
  13. command = new_command;
  14. }
  15. command[length++] = c;
  16. }
动态扩展内存 _(realloc)_
如果输入超过分配的大小,缓冲区会加倍 _(size = 2)_。
_realloc_ 尝试调整缓冲区大小;如果失败,释放内存并显示错误。
存储字符
来自 _getchar()_ 的每个字符按顺序存储在 _command[length++]_
完成输入
  1. command[length] = '\0'; // 空终止字符串
  2. return command;
空终止 (\\0): 确保字符串正确终止,以便它可以作为有效的C字符串处理。
返回输入: 函数返回动态分配的字符串以供进一步使用。
为什么采用这种方法?
📌 避免缓冲区溢出: _scanf_ _gets_ 不同,此方法根据需要动态扩展。
📌 高效的内存管理: _realloc_ 优化内存分配,而不是预分配大块内存。
📌 更好的灵活性: 可以处理长命令而无需任意限制。