linux下shell命令解析器

shell是一个命令语言解析器,有自己内建的shell命令集,shell也能被系统中其他应用程序所调用。用户在提示符下输入的命令都由shell先解释然后传给linux核心。 当普通用户成功登陆,系统将执行一个称为shell的程序,shell进程提供了命令行的提示符,对普通用户用”$”作提示符,超级用户用”#”作提示符。一旦出现shell提示符,就可以键入命令名称及命令需要的参数,shell将执行这些命令,如果命令花费太长时间运行,或屏幕产生大量输出,可以键入ctrl+c发出中断信号中断。 shell的模拟 运行时,程序会先进入一个死循环,直至用户输出exit时停止循环。死循环内,先用一个PutFlag()函数为程序输入命令行提示符 getpwuid()函数是通过用户的uid查找用户的passwd数据,如果出错,都返回一个空指针并设置errno的值,用户可以根据perror函数查看出错信息,utsname结构体则用来获取系统的信息,当命令行提示符打印后,用fflush冲刷掉标准输出上的内容(stdout)。 然后是接收键入的命令,由于fegts()函数会把键入的enter键收入到末尾,所以要手动把接收的命令最后一个元素置空。当命令输入完毕,对用户输入的命令做简单的解析,就是把包含命令的字符串分割成一个个单独的命令,strtok()函数会将cmd分割成以” ”为分隔符的字符串,再次调用时要将cmd设成NULL。 执行命令前,用fork()创建子进程,在子进程调用execv()函数替换程序,执行键入的命令,失败时退出,当父进程调用wait(),进程立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到一个已经变成僵尸进程的子进程,wait就会手机这个子进程的信息,并把它称帝销毁后返回,如果没有找到这样一个子进程,wait就会一直阻塞在这样里,知道有一个出现为止,wait(NULL)如果成功,返回被收集的子进程的ID,如果调用进程没有子进程,调用失败,返回-1,同时errno被设置为ECHILD。

经验分享 程序员 微信小程序 职场和发展