今天,我想通过用C编程语言创建自己的外壳来带您进入命令行魔术世界的激动人心的旅程。外壳是任何操作系统不可或缺的一部分,允许用户使用文本命令与系统进行交互。通过从头开始构建一个简单的外壳,您将对外壳的工作方式以及它们如何执行命令有了更深入的了解。
让我们加入
壳如何工作?
外壳读取用户输入,解释命令并通过分配子进程来执行它们。标准C库提供了诸如Fork(),exec()和Wait()之类的功能来帮助我们实现此目标。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
#define MAX_INPUT_LENGTH 100
int main() {
char input[MAX_INPUT_LENGTH];
char* args[MAX_INPUT_LENGTH];
int status;
while (1) {
printf("YourShell$ ");
fgets(input, sizeof(input), stdin);
/*Tokenize the input*/
char* token = strtok(input, " \n");
int i = 0;
while (token != NULL) {
args[i] = token;
token = strtok(NULL, " \n");
i++;
}
args[i] = NULL; /*Null-terminate the argument list*/
if (strcmp(args[0], "exit") == 0) {
printf("Exiting the shell...\n");
break;
}
pid_t pid = fork();
if (pid < 0) {
perror("Fork error");
} else if (pid == 0) {
/*Child process*/
if (execvp(args[0], args) == -1) {
perror("Execution error");
exit(EXIT_FAILURE);
}
} else {
/*Parent process*/
wait(&status);
}
}
return 0;
}
这是如何运作的
- 该程序设置一个循环以保持外壳运行,直到用户键入“退出”。
- 它提示用户进行输入,并使用fgets()。 从标准输入中读取命令。
- 然后,使用strtok()将输入示意为参数,并存储在args数组中。
- 外壳检查命令是否为“退出”;如果是这样,它将退出循环。
- 如果不是,它使用fork()分叉一个子过程。
- 在子进程中,该命令使用execvp()执行,该命令在系统路径中搜索命令并运行它。
- 父母的过程等待孩子使用wait()。
我们开始做吧!!
为了编译它,我们使用GCC
gcc simple_shell.c -o myshell
现在我们可以通过:
./myshell
结论
就是这样。这就是壳牌的工作方式。命令行的工作原理不是很有趣吗?ð
当然,您可以添加更多的东西,以使其更具功能丰富和鲁棒性,但这是一个很好的起点,可以更深入地深入外壳和命令行界面。
如果您有任何疑问或想分享您的经验,请在下面发表评论。我很想听听你的想法!
保持好奇,继续编码,直到下一次,Happy Hacking! ð
非常感谢Alx SE向我介绍了这个迷人的世界。