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;
}
网友评论