用fork( )和execvp( )编写自己的shell

可以实现大部分命令,cd 和 su 除外。
my_sh.c 代码: 
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <unistd.h>
#define PROMPT ">"
#define ARG_CNT 32
void cmd_line_to_arglist(char** arglist, char* cmd_line);
int main()
{
	char cmd_line[1024] ;
	char* arglist[ARG_CNT];
	while(memset(cmd_line,0,1024),printf("%s",PROMPT), fgets(cmd_line, 1024,stdin ) !=NULL)
	{
		if(cmd_line[0] != '\n')
		{
			cmd_line[strlen(cmd_line) - 1] = '\0';
			cmd_line_to_arglist(arglist, cmd_line);
			if(fork() > 0)
			{
				wait(NULL);
			}else 
			{
				execvp(arglist[0],arglist);
			}
		}
	}
	return 0 ;
}

void cmd_line_to_arglist(char** arglist, char* cmd_line)
{
	int word_cnt = 0 ;
	int first, second ;
	int word_len,index_copy ;
	first = 0 ;
	while(cmd_line[first] != '\0')
	{
		while(cmd_line[first] == ' ' && cmd_line[first] != '\0')
		{
			first ++ ;
		}
		if(cmd_line[first] == '\0')
		{
			break ;
		}
		second = first ;
		while(cmd_line[second] !=' ' && cmd_line[second] != '\0')
		{
			second ++ ;
		}
		word_len = second - first ;
		arglist[word_cnt] = (char*)calloc(word_len + 1, 1) ;
		for(index_copy = 0 ; index_copy < word_len ; index_copy ++)
		{
			arglist[word_cnt][index_copy] = cmd_line[index_copy + first];
		}
		word_cnt ++ ;
		first = second ;
	}
	arglist[word_cnt] = NULL ;
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值