IO 0718作业

一、思维导图

二、使用多进程 + wait + exec + strtok 实现一个伪装的终端

#include <myhead.h>

typedef struct sockaddr_in addr_in_t; 
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;

//读取一行,并去掉末尾的换行符
char *getLine(char *buf, int size)
{
	fgets(buf, size, stdin);
	int len = strlen(buf);
	if(buf[len - 1] == 10){
		buf[len - 1] = 0;
	}
}

int main(int argc, const char *argv[])
{
	while(1){
		int res = fork();
		if(res > 0){
			wait(0);
		}else if(res == 0){
			// 子进程部分,输入shell指令并替换成该shell指令进行运行
			char hostname[32] = {0};   //存放主机名
			char cwd[128] = {0};     //存放路径名
			char cmd[128] = {0};   //存放输入的终端指令

			char *username = getlogin();  //获取用户名
			gethostname(hostname, 32);  //获取主机名
			getcwd(cwd, 128);   //获取路径

			printf("\033[1;32;10m%s@%s\033[0m:\033[1;34;10m%s\033[0m$ ", username, hostname, cwd);
			fflush(stdout);
			getLine(cmd, 128);  //读取一行,并去掉末尾的换行符

			char *arg[20] = {0};
			int i = 0;
			char *res = 0;
			while(1){
				if(res == 0){
					res = strtok(cmd, " ");   //第一次分割
				}else{
					res = strtok(NULL, " ");  // NULL 分割剩下的字符串
				}
				if(res == 0){break;}
				arg[i++] = res;
			}
			/*
			for(int j=0; j<i; j++){
				printf("%s ", arg[j]);
				fflush(stdout);
			}
			printf("\n");
			*/
			if(strcmp("cd", arg[0]) == 0){
				chdir(arg[1]);   //cd指令
			}else{
				execvp(arg[0], arg);  //替换指令
			}
			printf("%s:未找到命令\n", arg[0]);  //如果execvp返回,说明执行失败
		}else{
			perror("fork");
			return 1;
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值