⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shell.c

📁 linux 下模拟shell的实现。 支持管道等功能。读proc文件
💻 C
字号:
#include <unistd.h>#include <stdio.h>#define MAX_CMD 100int main(){	int pid,ppid;	int i,j,jj,kk,k,len,tag,ptag,pipetag;	char cmd[10][10];	char pcmd[10][10];	char *pargv[10]={NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};	char *argv[10]={NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};	char buffer[100];	char *file,*pfile;	char* tip="kxz_shell# ";	int fds[2];	char pipebuf[12]={'\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'};	printf("\nWelcome to kxz_shell!\nDeveloped by Kong Xiangzhen 03055078 jsj33\n\n ");again:	pipetag=0;        for(i=0;i<10;i++)	{		argv[i]=NULL;	}		if((len=write(1,tip,11))<0)	{		perror("write error!");		exit(0);	}	if((len=read(0,buffer,sizeof(buffer)))<0)	{		perror("read error!");		exit(0);	}	i=0;	j=0;	jj=0;        k=0;	kk=0;        while(i<len-1)	{			        while((buffer[i]!=' '&&buffer[i]!='|')&&i<len-1)	        {	         	cmd[j][k]=buffer[i];	        	i++;			k++;         	}		cmd[j][k]='\0';        	argv[j]=cmd[j];		printf("cmd %d=%s**\n",j,cmd);		if(buffer[i]==' ')		{			while(buffer[i]==' ')				i++;			k=0;			j++;					}		if(buffer[i]=='|')        	{			pipetag=1;			i++;			while(buffer[i]==' ')i++;			while(buffer[i]!=' '&&i<len-1)			{				pcmd[jj][kk]=buffer[i];				i++;				kk++;			}			pcmd[jj][kk]='\0';			pargv[jj]=pcmd[jj];						printf("pcmd %d=%s**\n",jj,pcmd);		}	}         	while((pid=fork())<0);	if(pid==0)	{		printf("pipetag=%d\n",pipetag);		if(pipetag==1)		{			if(pipe(fds)==-1)			{				perror("Pipe Error");				exit(-1);			}			while((ppid=fork())<0);			if(ppid>0)			{				close(fds[0]);				write(fds[1],"/dev/stdout",11);				sleep(3);	                	file=cmd[0];	                	tag=execvp(file,argv);				wait(NULL);			}			else{				close(fds[1]);				read(fds[0],pipebuf,11);				printf("recive =%s***\n",pipebuf);				pargv[1]=pipebuf;								printf("\nThis is out by pipe\n");				pfile=pcmd[0];				ptag=execvp(pfile,pargv);				if(ptag<0)					printf("Bad command for pipe!\n");			}		}                            	       	file=cmd[0];	             	tag=execvp(file,argv);		if(tag<0)			printf("Bad command!\n");									}	else{		wait(0);		goto again;	}		return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -