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

📄 shell.c

📁 一个linux下的简单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 8struct {      char *argv[MAXARG];     char *in, *out;} cmd[MAXPIPE+1];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(){     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;          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);     }}

⌨️ 快捷键说明

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