shell程序如何运行的(另附shell源码)

2019-01-24  本文已影响0人  荷叶的莲藕

shell程序如何运行的

一个shell主循环执行下面的4步

1.用户输入a.out
2.shell建立一个新的进程来运行这个程序。
3.shell将程序从磁盘载入;
4.程序在它的进程中运行直到结束。

#include <stdio.h>
#include <stdlib.h>
main()
{
        char * arglist[3];

        arglist[0] = "ls";
        arglist[1] = "-l";
        arglist[2] = NULL;
        printf("*** About to exec ls -l\n");
        execvp("ls",arglist);
        printf("*** ls is done. bye\n");
}

​ 一个程序在一个进程中运行---也就是一些内存和内核中相应的数据结构。这样,execvp将程序从磁盘载入进程以便它可以被运行。
exec系统调用从当前进程中把当前程序的机器指令清楚,然后再空的进程中载入调用时指定的程序代码,最后运行这个新的程序。exec调整进程的内存分配使之适应新的程序对内存的要求。相同的进程,不同的内容。

下面是最原始的shell程序

#include<stdio.h>
#include<signal.h>
#include<string.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 ,*malloc();
    buf[strlen(buf)-1]='\0';
    cp = malloc(strlen(buf)+1);
    if(cp == NULL)
    {
        fprintf(stderr,"no memory\n");
        exit(1);
    }
    strcpy(cp,buf);
    return cp;
}
上一篇 下一篇

猜你喜欢

热点阅读