优秀的编程知识分享平台

网站首页 > 技术文章 正文

我如何用C语言构建简单Shell (一)

nanyue 2025-09-04 14:10:16 技术文章 6 ℃

第1部分:在自定义Shell中读取用户输入(C编程)

在我的自定义shell项目的这一部分中,我将解释如何在C中动态读取用户输入。在shell环境中正确处理用户输入是至关重要的,因为命令的长度可能不同。我没有使用固定大小的缓冲区,而是实现了动态内存分配方法以获得更好的灵活性。


理解read_command函数

read_command() 函数负责:
动态读取用户输入
处理内存分配和重新分配以避免缓冲区溢出
确保输入字符串的正确终止

代码分解

#ifndef READ_COMMAND_H
#define READ_COMMAND_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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

char *read_command();

#endif

o 头文件保护 (#ifndef READ_COMMAND_H): 防止多次包含。

o 常量定义 (INT_BUFFER_SIZE): 设置输入存储的初始缓冲区大小。


read_command()的实现

char *read_command()
{
    char *command = malloc(INT_BUFFER_SIZE * sizeof(char));
    if (!command)
    {
        perror("Memory allocation failed");
        exit(EXIT_FAILURE);
    }

o 内存分配 (malloc): 最初为存储用户输入分配 INT_BUFFER_SIZE 字节。

o 错误处理: 如果 malloc 失败,程序打印错误并退出。

int size = INT_BUFFER_SIZE;
    int length = 0;
    int c;

o size: 跟踪当前缓冲区大小。

o length: 跟踪实际读取的字符数。

o c: 存储从 getchar() 获取的输入字符。


处理动态输入增长

while ((c = getchar()) != '\n' && c != EOF)
{
    if (length >= (size - 1))
    {
        size *= 2;  // 需要时将缓冲区大小加倍
        char *new_command = realloc(command, (size + 1));
        if (!new_command)
        {
            free(command);
            perror("Memory reallocation failed");
            exit(EXIT_FAILURE);
        }
        command = new_command;
    }
    command[length++] = c;
}

1. 动态扩展内存 (realloc)

o 如果输入超过分配的大小,缓冲区会加倍 (size *= 2)

o realloc 尝试调整缓冲区大小;如果失败,释放内存并显示错误。

2. 存储字符

o 来自 getchar() 的每个字符按顺序存储在 command[length++]


完成输入

command[length] = '\0';  // 空终止字符串
return command;

o 空终止 (\0): 确保字符串正确终止,以便它可以作为有效的C字符串处理。

o 返回输入: 函数返回动态分配的字符串以供进一步使用。


为什么采用这种方法?

避免缓冲区溢出:scanfgets 不同,此方法根据需要动态扩展。
高效的内存管理:
realloc 优化内存分配,而不是预分配大块内存。
更好的灵活性: 可以处理长命令而无需任意限制。

Tags:

最近发表
标签列表