简易版: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'; // 安全地去除换行符
接下来要把这一整行按空格切成参数数组。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[0], argv);
(count < ) perror();
(EXIT_FAILURE);
} {
waitpid(, , );
}



