前情提要:掌握进程控制中的进程创建、进程终止、进程等待、进程替换。可以参考下方博文
LInux(四)进程控制(创建、终止、等待、替换)
了解strtok函数的使用
正文:
目录
Shell是什么?
如何进行实现?
1、用户终端输入命令
2、程序对输入命令进行解析
3、创建一个子进程(脏活子进程来做)
4、子进程内部进行程序替换,让子进程处理对应程序
5、父进程中进行进程等待,避免产生僵尸进程
完整源码:
Shell是什么?
根据用户所输入的命令,来进行一系列对应命令名称的对应操作。
如何进行实现?
1、用户终端输入命令
9 while(1)
10 {
11 printf("[Linux: Shell] $ ");
12 fflush(stdout);
13
14 char cmd[1024] = {0};// 初始化一个cmd数组用来存放输入信息
15 gets(cmd);16 }
2、程序对输入命令进行解析
16 int argc = 0;
17 char*argv[32] = {NULL};
18 argv[argc++] = strtok(cmd, " "); // 字符串分割函数,将空格字符全部替换为'\0';
19 while((argv[argc] = strtok(NULL, " "))!=NULL){
20 argc++;21 }
3、创建一个子进程(脏活子进程来做)
25 pid_t child_pid = fork();
26 if(child_pid < 0){
27 perror("error fork");
28 continue;
29 }else if(child_pid == 0) {子进程}
4、子进程内部进行程序替换,让子进程处理对应程序
子进程创建失败就要进行进程终止
29 }else if(child_pid == 0){
30 //execve、execvp、execv、execl、execlp、execle
31 //这里选择execvp() 不需要给出环境变量、也不需要指定路径
32 execvp(argv[0], argv); // argv第一个参数就保存的命名名
33 perror("execvp error");
34 exit(0); // 上方进程替换成功进入新程序,替换失败走到exit(0)
5、父进程中进行进程等待,避免产生僵尸进程
36 wait(NULL); //进行等待任意一个子进程退出
执行结果:
完整源码:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
#include<string.h>
int main()
{
while(1)
{
printf("[Linux: Shell] $ ");
fflush(stdout);
char cmd[1024] = {0};// 初始化一个数组用来存放输入信息
gets(cmd);
int argc = 0;
char*argv[32] = {NULL};
argv[argc++] = strtok(cmd, " "); // 字符串分割函数,将空格字符全部替换为'\0';
while((argv[argc] = strtok(NULL, " "))!=NULL){
argc++;
}
for(int i = 0; argv[i]!=NULL; i++)
printf("[%s]\n",argv[i]); //显示输入信息
pid_t child_pid = fork();
if(child_pid < 0){
perror("error fork");
continue;
}else if(child_pid == 0){
//execve、execvp、execv、execl、execlp、execle
//这里选择execvp() 不需要给出环境变量、也不需要指定路径
execvp(argv[0], argv);
perror("execvp error");
exit(0); // 上方进程替换成功进入新程序,替换失败走到exit(0)
}
wait(NULL); // 进行等待任意一个子进程退出
}
return 0;
}