C语言execvp实现简易Shell的两种方法

本文介绍了两种实现简易Shell命令解析器的方法。方法一使用标准C库函数如`fork()`和`execvp()`来解析和执行命令;方法二采用更高级的技术如`glob()`函数进行路径扩展,提供更强大的命令解析能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 方法一:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <wait.h>
#include <unistd.h>
#include <sys/types.h>

int main()
{
	pid_t pid;
	char tmp[128];
	char *buf[32];
	int i = 0;

	while(1)
	{
		i = 0;
		printf("root$:");
		fgets(tmp,sizeof(tmp)-1,stdin);
		tmp[strlen(tmp)-1] = '\0';
		buf[i] = strtok(tmp," ");
		if(strncmp(buf[0],"quit",4) == 0)
			break;
		else 
			printf("%s\n",buf[i]);

		while((buf[++i] = strtok(NULL," ")) != NULL)
			//puts(buf[i]);
		
		buf[i] = NULL;

		pid = fork();
		if(pid < 0)
		{
			perror("fork()");
			exit(1);
		}
		if(pid == 0)
		{
			execvp(buf[0],buf);
			perror("execvp()");
			exit(1);	
		}
		else
		{
			wait(NULL);
		}
	}
	return 0;
}

 方法二:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <wait.h>
#include <glob.h>

#define DELTMS	" "

struct cmd_st
{
	glob_t globres;
};

static void prompt(void)
{
	printf("mysh-0.1$ ");
}


static void parse(char *line, struct cmd_st *res)
{
	char *tok;
	int i = 0;

	while(1)
	{
		tok = strsep(&line,DELTMS);
		if(tok == NULL)
			break;
		if(tok[0] == '\0')
			continue;
		
		glob(tok,GLOB_NOCHECK|GLOB_APPEND*i,NULL,&(res->globres));
		i =1;
	}
	//for(i = 0;i < res->globres.gl_pathc;i++)
	//	puts(res->globres.gl_pathv[i]);
}

int main()
{
	char *linebuf = NULL;
	size_t linebuf_size = 0;
	pid_t pid;
	struct cmd_st cmd;

	while(1)
	{
		prompt();

		if(getline(&linebuf,&linebuf_size,stdin) < 0)
			break;
		linebuf[strlen(linebuf)-1] = '\0';

		parse(linebuf,&cmd);

		if(0)		//内部命令
		{
			
		}
		else		//外部命令
		{
			pid = fork();

			if(pid < 0)
			{
				perror("fork()");
				exit(1);
			}
			if(pid == 0)
			{
				execvp(cmd.globres.gl_pathv[0],cmd.globres.gl_pathv);
				perror("execvp()");
				exit(1);
			}
			else
			{
				wait(NULL);
			}
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值