1实现一个minishell
了解Linux中shell的底层实现原理
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <sys/wait.h>
int main()
{
while(1) {
//反复打印,模拟shell
printf("[wh@ahshizz ~]$ ");
//刷新显示器的缓冲区
fflush(stdout);
//定义一个数组用来保存用户输入的命令
char tmp[1024];
scanf("%[^\n]%*c",tmp);
//定义一个指针数组,用来进行字符串分离
int argc=0;
char* argv[32]={NULL};
char* ptr=tmp;
//循环使字符串进行分离
while(*ptr!='\0') {
//判断如果不是空格
if(!isspace(*ptr)) {
//把首个元素的地址保存到指针数组
argv[argc]=ptr;
argc++;
//循环直到变成空格
while(!isspace(*ptr)&&*ptr!='\0') {
ptr++;
}
//给一个字符串的尾部补上'\0'
*ptr='\0';
ptr++;
continue;
}
ptr++;
}
//把数组后面的没用到的截断
argv[argc]=NULL;
//cd是系统调用命令,应该把cd放入execvp的第二个参数
if(!strcmp(argv[0],"cd")) {
chdir(argv[1]);
continue;
}
//创建子进程,子进程完成shell命令
pid_t pid=fork();
if(pid==0) {
execvp(argv[0],argv);
exit(0);
}
//父进程等待回收子进程
wait(NULL);
}
return 0;
}
2实现minishell输出重定向
使用dup2函数,可以实现输出的重定向
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <sys/wait.h>
#include <fcntl.h>
int main()
{
//修改系统的掩码
umask(0);
//打开一个文件,没有则进行创建,写的方式打开,追加的方式写数据,文件权限
int fd=open("./test",O_CREAT | O_WRONLY | O_APPEND,0664);
//实现输出重定向,把输出在显示器的内容,输出到创建的文件中
dup2(fd,STDOUT_FILENO);
while(1) {
printf("[wh@ahshizz ~]$ ");
fflush(stdout);
char tmp[1024];
scanf("%[^\n]%*c",tmp);
int argc=0;
char* argv[32]={NULL};
char* ptr=tmp;
while(*ptr!='\0') {
if(!isspace(*ptr)) {
argv[argc]=ptr;
argc++;
while(!isspace(*ptr)&&*ptr!='\0') {
ptr++;
}
*ptr='\0';
ptr++;
continue;
}
ptr++;
}
argv[argc]=NULL;
if(!strcmp(argv[0],"cd")) {
chdir(argv[1]);
continue;
}
pid_t pid=fork();
if(pid==0) {
execvp(argv[0],argv);
exit(0);
}
wait(NULL);
}
return 0;
}