我们在终端中运行一个程序, 这个程序的父进程实际上是shell程序
当我们在shell中输入了一个命令, 这时候其实shell对这个标准输入进行解析, 得到了程序名称. 然后创建子进程, 并且将子进程的程序替换为当前这个解析出来的程序
今天, 我们要实现一个minishell程序, 步骤如下:
1.等待标准输入获取命令行 fgets()-从标准输入读取一行数据
2.获取到标准输入之后,进行字符串解析,得到命令名称以及运行参数
3.创建子进程 fork()
4.子进程中进行程序替换,运行指定的命令 execvp()-程序替换(不用指定程序路径)
5.父进程进程等待,等待子进程命令执行完毕 wait()-避免僵尸进程
代码如下:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
int main()
{
while(1)
{
//1.等待标准输入
char buf[1024] = {0};
printf(" minishell @@:%s", buf);
fgets(buf, 1023, stdin);
buf[strlen(buf)-1] = '\0';
//2.对输入数据进行解析
char* argv[32] = {NULL};
int argc = 0;
char* ptr = buf;
// [ ls -a -l ]
while(*ptr != '\0')
{
if(*ptr != ' ')
{
argv[argc] = ptr;
argc++;
while(*ptr != ' ' && *ptr != '\0')
{
ptr++;
}
*ptr = '\0';
}
ptr++;
}
argv[argc] = NULL; //最后一个参数的下一个位置置NULL
//3.创建子进程
pid_t pid = fork();
//4.在子进程中程序替换
if(pid == 0)
{
execvp(argv[0], (char**)argv); //程序替换成功就去运行新程序,失败则打印错误
perror("execvp failed"); //打印上一次系统调用接口使用错误的原因
exit(0);
}
//5.进程等待
wait(NULL);
return 0;
}
}