linux 操作系统的shell有很多种,比如bash shell,csh shell等等,最常用的是bash shell。shell是一个解释器,它将我们输入的命令逐个解释执行。
当我们在终端提示符下输入命令时,这时会fork一个进程,父进程当然是shell程序/bin/sh,返回值大于0(子进程的PID),这是在父进程中执行,返回值为0.,在子进程中执行
pid=fork();
swith(pid)
{
case -1 ;
perror('it is fault");
break;
case 0;
printf("in the child process pid=%d/n" getpid();
execv(.....);
break;
default:
printf("in the parent process");
break;
}
子进程继承了父进程的环境(environment),调用exec函数并跳到相应的路径下去执行,当终端出现提示符时,子进程执行完毕。
比如;我们在终端输入su命令,按下enter键后,shell fork了一个子进程,由于子进程继承了父进程的执行环境,因此从shell的环境变量中
搜索su,发现在/sbin下,然后调用exec家族函数跳到/sbin下去执行su命令。
注意,有的时候,我们输入的命令会出现command not found ,但是我们明明在我们的根目录下相关的文件夹找到了这个命令,这是因为问们的环境变量设置问题,可以在终端中输入printenv,会显示环境变量,我们输入的命令会在这个环境变量指定的目录下查找,如果没有就会输出上面的提示。此时我们可以修改环境变量,让其指向所有包含命令的目录即可。我们的shell是怎么提取这些命令来执行呢?
#include<stdio.h>
int main(int argc,char* argv[] )
{
int i;
for(i=0;i<argc;i++)
{
printf("agrv[%d] is %s/n",i,argv[i]);
}
return 0;
}
~
编译以后 gcc -o arg arg.c
在终端中输入。./arg arg1 arg2
会出现
argv[0]=./arg
argv[1]=arg1
argv[2]=arg2
不如我们输入命令 ls -r
argv[0]=ls
argv[1]=r(过滤掉“-”符号)
说明:argc 是指输入参数的个数(包括命令ls),而argv则是输入参数的字符串指针数组,shell就是通过这种方式传递参数,执行相应的命令。