《unixlinux编程实践教程》学习笔记:第八章 编写命令解释器sh

    xiaoxiao2021-03-25  86

    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; }
    转载请注明原文地址: https://ju.6miu.com/read-36005.html

    最新回复(0)