shell如何运行程序 shell用fork建立新进程,用exec在新进程中运行用户指定的程序,最后shell用wait等待新进程的结束。
截图
代码: sh1.c 没有使用fork,只能运行一个进程
#include <stdio.h> #include <signal.h> #include <string.h> #include <stdlib.h> #define MAXARGS 20 #define ARGLEN 100 int main() { char *arglist[MAXARGS+1]; int numargs; char argbuf[ARGLEN]; char *makestring(); numargs = 0; while(numargs < MAXARGS) { printf("Arg[%d]?",numargs); if(fgets(argbuf,ARGLEN,stdin)&& *argbuf != '\n') arglist[numargs ++]=makestring(argbuf);//将读入内容转化为字符串 else{ if(numargs > 0){ arglist[numargs] = NULL; execute(arglist);//执行字符串对应程序 numargs = 0; } } } return 0; } int execute( char *arglist[]) { execvp(arglist[0],arglist); perror("execvp failed"); exit(1); } char * makestring(char *buf) { char *cp; buf[strlen(buf)-1]='\0'; cp = (char *)malloc(strlen(buf)+1); if(cp == NULL){ fprintf(stderr,"no memory\n"); exit(1); } strcpy(cp,buf); return cp; }sh2.c
#include <stdio.h> #include <signal.h> #include <string.h> #include <stdlib.h> #define MAXARGS 20 #define ARGLEN 100 int main() { char *arglist[MAXARGS+1]; int numargs; char argbuf[ARGLEN]; char *makestring(); numargs = 0; while(numargs < MAXARGS) { printf("Arg[%d]?",numargs); if(fgets(argbuf,ARGLEN,stdin)&& *argbuf != '\n') arglist[numargs ++]=makestring(argbuf); else{ if(numargs > 0){ arglist[numargs] = NULL; execute(arglist); numargs = 0; } } } return 0; } int execute( char *arglist[]) { int pid,exitstatus; pid = fork(); switch (pid){ case -1: perror("fork failed"); exit(1); case 0: execvp(arglist[0],arglist); perror("execvp failed"); default: while (wait(&exitstatus) != pid);//等待进程退出 printf("child exited with status %d,%d\n",exitstatus>>8,exitstatus&0377); } } char * makestring(char *buf) { char *cp; buf[strlen(buf)-1]='\0'; cp = (char *)malloc(strlen(buf)+1); if(cp == NULL){ fprintf(stderr,"no memory\n"); exit(1); } strcpy(cp,buf); return cp; }