【Linux】1w详解如何实现一个简单的shell
实现一个简单的shell需要解析用户输入的命令,然后执行这些命令。以下是一个简单的shell示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#define MAX_COMMAND_LEN 1024
int main() {
char command[MAX_COMMAND_LEN];
char *argv[MAX_COMMAND_LEN / 2]; // 假设命令行参数不会超过512个
int argc = 0;
while (1) {
// 打印提示符
printf("my_shell$ ");
fflush(stdout); // 刷新输出缓冲区
// 读取用户输入的命令行
if (fgets(command, MAX_COMMAND_LEN, stdin) == NULL) {
perror("fgets error");
continue;
}
// 解析命令行,将命令行分解为命令和参数
char *token = strtok(command, " ");
while (token != NULL) {
argv[argc++] = token;
token = strtok(NULL, " ");
}
argv[argc] = NULL; // 参数列表以NULL结尾
// 创建子进程执行命令
pid_t pid = fork();
if (pid == -1) {
perror("fork error");
continue;
}
if (pid == 0) { // 子进程
if (execvp(argv[0], argv) == -1) {
perror("execvp error");
}
exit(EXIT_FAILURE); // 如果execvp失败,子进程将退出
} else { // 父进程
int status;
waitpid(pid, &status, 0); // 等待子进程结束
}
argc = 0; // 重置参数列表
}
return 0;
}
这段代码中,我们创建了一个无限循环,在循环中等待用户输入命令。使用fgets
读取用户输入的命令行,然后使用strtok
函数分解命令行为命令和参数。接着,使用fork
创建子进程,在子进程中使用execvp
执行解析出来的命令。父进程使用waitpid
等待子进程结束。
这个简单的shell实现没有处理特殊情况,如命令行参数超长、命令不存在等,并且没有错误处理。在实际应用中,你需要添加更多的错误检查和处理逻辑。
评论已关闭