Linux中自主实现一个shell

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值