1.如何判断一个进程返回值是否为正常退出
进程等待可以保证进程不会变为僵尸进程,通过wait(int* status)和waitpid(pid_t pid, int* status,int options)这两个接口,可以接受子进程的返回值,返回值存在status的低16位的高8位中,因此最终的返回值应该为status>>8 & 0xff,这样可以只把返回值取出。而status中的低8位的低7位是程序异常退出的信号值,通过该值可以判断是什么问题;当其全为0时,则说明是正常退出。
2.程序替换
程序替换主要是通过exec函数族实现的,主要有以下6个:
int execl(const char* path,const char* arg,…);
int execlp(const charfile,const char arg,…);
int execle(const char* path,const char* arg,…,char* const envp[]);
int execv(const char* path,const char* argv,…);
int execvp(const charfile,const char argv,…);
int execve(const char* path,const char* argv,…,char* const envp[]);
l和v的区别:在于程序运行参数的赋值方式不同,l是通过不定参数完成的,v是通过字符串指针数组进行赋值的;
有p和没有p 的区别:在于第一个参数执行新程序的时候是否需要带路径,(默认去系统环境变量PATH指定的路径下寻找);
有e和没有e 的区别:在于要不要初始化,有e则要初始化,无e则不需要初始化。
3.编写minishell 的流程
总体分为5个步骤:
1.等待用户的标准输入;
2.解析标准输入;
3.创建子进程;
4.程序替换;
5.进程等待。