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

📄 shell.c

📁 自己实现的简单的shell 自己实现的简单的shell 自己实现的简单的shell
💻 C
字号:
#include <stdio.h>#include <string.h>#include <unistd.h>#include <stdlib.h>#include <sys/wait.h>#include <sys/types.h>#include <fcntl.h>#define MAXLINE 4096#define MAXPIPE 16#define MAXARG 8#define MAX_IN_CMD 2struct {      char *argv[MAXARG];     char *in, *out;} cmd[MAXPIPE+1];extern int do_cd(char **argv);extern int do_exit(char **argv);typedef int (*func_t)(char *argv[]);struct {	char *cmd_name;	func_t handler;}incmd[MAX_IN_CMD] = {{"cd", do_cd}, {"exit", do_exit}};int do_cd(char **argv){	return chdir(argv[0]);}int do_exit(char **argv){	exit(0);}int parse(char *buf, int cmdnum){     int n = 0;     char *p = buf;     cmd[cmdnum].in = cmd[cmdnum].out = NULL;     while (*p != '\0')     {          if (*p == ' ')          {               *p++ = '\0';               continue;          }          if (*p == '<')          {               *p = '\0';               while (*(++p) == ' ');               cmd[cmdnum].in = p;               if (*p++ == '\0')                    return -1;               continue;          }          if (*p == '>')          {               *p = '\0';               while (*(++p) == ' ');               cmd[cmdnum].out = p;               if (*p++ == '\0')                    return -1;               continue;          }          if (*p != ' ' && ((p == buf) || *(p-1) == '\0'))          {               if (n < MAXARG - 1) {                    cmd[cmdnum].argv[n++] = p++;                    continue;               } else                    return -1;          }          p++;     }     if (n == 0)          return -1;     cmd[cmdnum].argv[n] = NULL;     return 0;}int main(void){     char buf[MAXLINE];     pid_t pid;     int fd, i, j, pfd[MAXPIPE][2], pipe_num, cmd_num;     char* curcmd, *nextcmd;     while (1) {		 printf("mysh%% ");		 if (!fgets(buf, MAXLINE, stdin))			 exit(0);		 if (buf[strlen(buf)-1]=='\n')			 buf[strlen(buf)-1]='\0';		 cmd_num = 0;		 nextcmd = buf;		 while (curcmd = strsep(&nextcmd, "|")) {			 if (parse(curcmd, cmd_num++)<0) {				 cmd_num--;				 break;			 }			 if (cmd_num == MAXPIPE + 1)				 break;		 }		 if (!cmd_num)			 continue;		 if(cmd_num == 1){			for(i = 0; i < MAX_IN_CMD; i++){				if(!strcmp(incmd[i].cmd_name, cmd[0].argv[0])){					incmd[i].handler(&cmd[i].argv[1]);					break;				}			}			if(i < MAX_IN_CMD)				continue;		 }		 pipe_num = cmd_num - 1;						 for (i=0; i<pipe_num; i++)			 if(pipe(pfd[i])){				 perror("pipe");				 exit(1);			   }		 for (i=0; i<cmd_num; i++)			 if ((pid=fork())==0)				 break;		 if (pid==0) {			 if (pipe_num) {				 if (i==0) {					 dup2(pfd[0][1], STDOUT_FILENO);					 close(pfd[0][0]);					 for (j=1; j<pipe_num; j++) {						 close(pfd[j][0]);						 close(pfd[j][1]);					 }				 } else if (i==pipe_num) {					 dup2(pfd[i-1][0], STDIN_FILENO);					 close(pfd[i-1][1]);					 for (j=0; j<pipe_num-1; j++) {						 close(pfd[j][0]);						 close(pfd[j][1]);					 }				 } else {					 dup2(pfd[i-1][0], STDIN_FILENO);					 close(pfd[i-1][1]);					 dup2(pfd[i][1], STDOUT_FILENO);					 close(pfd[i][0]);					 for (j=0; j<pipe_num; j++) 						 if (j!=i || j!=i-1) {					   close(pfd[j][0]);					   close(pfd[j][1]);					  }				 }			 }			 if (cmd[i].in) {				 fd = open(cmd[i].in, O_RDONLY);				 if (fd != -1)				 dup2(fd, STDIN_FILENO);			 }			 if (cmd[i].out) {				 fd = open(cmd[i].out, O_WRONLY|O_CREAT|O_TRUNC, 0644);				 if (fd != -1)					 dup2(fd, STDOUT_FILENO);			 }			 execvp(cmd[i].argv[0], cmd[i].argv);			 fprintf(stderr, "executing %s error.\n", cmd[i].argv[0]);			 exit(127);		 }		 for (i=0; i<pipe_num; i++) {			 close(pfd[i][0]);			 close(pfd[i][1]);		 }		 for (i=0; i<cmd_num; i++)			 wait(NULL);	 }	return 0;}

⌨️ 快捷键说明

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