出bug的代码
//生成机器可执行文件times的源代码times.c
int main(int argc,char *argv[]){
int i;
int status;
printf("argc = %d\n",argc);
for(i=0; i<argc; i++){
do_cmd(argv[i]); //do_cmd中调用system函数, system函数的参数为argv[i]
}
exit(0);
}
问题描述和解释以及解决方法
上面代码中的for循环从0开始, argcv[0]为./times, 意味着system函数要调用shell执行./times并把参数传给它, 而./times又会调用system函数, system函数接着调用shell执行./times并把参数传给它, 无限套娃下去, 所以需要将for循环改为从1开始
知识点总结
shell也是一个程序, 当在shell中通过命令运行程序时, 比如./times date
, shell程序接收到的参数有两个, argv[0]为./times
, argv[1]为date
. 然后shell会通过fork和exec来执行这个机器可执行程序, 需要知道的是, fork出的子程序会继承父进程中的参数和环境变量(当然这里不管环境变量什么事), exec函数也不会改动进程空间中的参数和环境变量的存储区域, 所以shell中接收到的参数便完整的存活在可执行程序times的进程空间中, 所以传递给times的主函数main中的参数列表就是传给shell的argv[0]和argv[1]