简易版:Shell 基础构建
一个标准的 Shell 启动后,通常会先显示提示符,等待用户输入。为了模拟这一行为,我们需要获取当前环境变量信息,比如用户名和家目录。这里直接调用 getenv() 函数即可,头文件包含 <stdlib.h>。
命令行输入与解析
Shell 的核心在于处理用户输入的字符串。我们使用 fgets() 从标准输入流读取整行命令,例如 ls、pwd 或 touch。读取后记得去除末尾的换行符,否则会影响后续处理。
#define MAX 32
char str[MAX];
fgets(str, sizeof(str) - 1, stdin);
str[strnlen(str, MAX) - 1] = '\0'; // 安全地去除换行符
接下来需要将这串字符按空格分割成独立的参数数组。C 标准库中的 strtok() 是处理此类任务的高效工具。需要注意的是,strtok 会修改原字符串(将分隔符替换为 \0),且状态管理特殊:首次调用传入待分割字符串,后续迭代只需传入 NULL,否则会重置分割位置。
#include <string.h>
char* argv[MAX] = { NULL };
const char* delim = " \t\n"; // 常见的空白符作为分隔符
int i = 0;
argv[i++] = strtok(str, delim);
while (argv[i - 1]) {
argv[i++] = strtok(NULL, delim);
}
进程创建与执行
拿到参数数组后,就可以利用系统调用来执行命令了。核心流程是 fork() 创建子进程,然后在子进程中用 execvp() 替换当前映像。
pid_t d = fork();
if (d == 0) {
// 子进程逻辑
if (argv[0] == NULL) return 0;
int count = execvp(argv[], argv);
(count < ) perror();
(EXIT_FAILURE);
} {
waitpid(, , );
}



