[操作系统,学习记录]3.进程(2)

1.fork();

玩法一:通过返回值if,else去执行不同的代码片段

玩法二:if,else然后调用execve函数去执行新的程序

2.进程终止:

        退出码,子进程通过exit/return返回,父进程wait/waitpid等待而得,status(虽int但仅利用后八位),

[操作系统,学习记录]3.进程(2)_第1张图片

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:

这里先鸽着,等以后填坑

你可能感兴趣的:(学习)