linux环境下用C写一个shell,麻雀虽小,五脏俱全,支持内置命令以及ls ,cd , vim 等等命令。
录制视频的时候,有一些点忘记了,当时没有给大家讲清楚,特地来这里阐述一下。
pid_t waitpid(pid_t pid,int *status,int options);
成功:返回等待的子进程ID;失败:-1
我们在options字段里,使用了WUNTRACED,意思是若子进程进入暂停状态,则马上返回,但子进程的结束状态不予以理会。
我们对于状态码的判断,是写在这个while循环里的
while(!WIFEXITED(status) && !WIFSIGNALED(status))
其中:
1. WIFEXITED(status) 若此值为非0 表明进程正常结束。
若上宏为真,此时可通过WEXITSTATUS(status)获取进程退出状态(exit时参数)
2. WIFSIGNALED(status)为非0 表明进程异常终止。
若上宏为真,此时可通过WTERMSIG(status)获取使得进程退出的信号编号
我们这里可以改写一下我们的while循环
while(!WIFEXITED(status) && !WIFSIGNALED(status)) 等价于
while(!(WIFEXITED(status) || WIFSIGNALED(status)))
若想要while循环继续执行
则需要!(WIFEXITED(status) || WIFSIGNALED(status)) = 1
也就是(WIFEXITED(status) || WIFSIGNALED(status)) = 0
说明 我们的子进程,没有正常终止,但是也没有异常终止,说明子进程仍在运行中
所以我们的父进程需要轮询等待。