1.fork();
玩法一:通过返回值if,else去执行不同的代码片段
玩法二:if,else然后调用execve函数去执行新的程序
2.进程终止:
退出码,子进程通过exit/return返回,父进程wait/waitpid等待而得,status(虽int但仅利用后八位),
return n; == exit(n);
3.进程等待:
父进程不管子进程(不wait),父进程退出——孤儿进程,不退出——僵尸进程(内存泄漏)
父进程用wait/waitpid函数来回收子进程
pid_t wait(int* status);
// 返回值:
// 成功返回被等待进程pid,失败返回-1。
// 参数:
// 输出型参数,获取⼦进程退出状态,不关⼼则可以设置成为NULL
pid_ t waitpid(pid_t pid, int *status, int options);
// 返回值:
// 当正常返回的时候waitpid返回收集到的⼦进程的进程ID;如果设置了选项
// WNOHANG(第三个参数),⽽调⽤中
// waitpid发现没有已退出的⼦进程可收集,则返回0;
// 如果调⽤中出错,则返回-1,这时errno会被设置成相应的值以指⽰错误所在;
// 参数:
// pid:
// pid == -1,等待任意一个子进程
// pid > 0(pid为子进程pid)等待指定的子进程
// status:输出型参数
// 这里介绍两个查看进程status的宏:
// WIFEXITED(status);(wait if exited)判断是否正常退出
// WEXITSTATUS(status);若正常退出则为子进程退出码
// options:0为阻塞等待
// WNOHANG——意为"wait no hang"简写,表不阻塞等待,可能为1,不建议使用1代替这个宏
都有status保存退出码了,为什么还要WEXITSTATUS这个宏来提取?
因为status是int类型,但是被当成位图使用,它的8-15位存的是退出状态
4.进程程序替换(玩法二)
利用exec系列函数去替换调用新的程序,exec意为execute
5.自主设计一个简单的shell:
这里先鸽着,等以后填坑