第八章中出现了很多的函数,为了接下来的Homework和Shell Lab,这里对于第八章中的函数进行一个小小的汇总
#include <sys/types.h>
#include <unistd.h>
// 返回调用进程的PID
pid_t getpid(void);
// 返回调用进程的父进程的PID
pid_t getppid(void);
#include <stdlib.h>
// 以status退出状态来终止进程
void exit(int status);
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
fork函数会创建一个子进程,这个子进程几乎和父进程完全一样,是父进程的一个副本,不过他们共享着相同的文件。
在调用fork时,会产生一个子进程;调用结束后,分别在父进程和子进程中返回值:父进程中fork返回的是子进程的pid,子进程的返回值是0。
一个子进程中止后,父进程需要将其回收,释放系统内存资源。回收子进程通过waitpid函数来完成。
#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *startup, int options);
pid_t wait(int *startup);
**返回值:**如果回收成功,返回子进程的PID;在WNOHANG状态下,返回值为0;其他情况或错误下,返回值为-1
**等待集合成员的判定:**由pid确认
pid > 0,等待的是进程ID等于pid的进程pid = -1,等待成员是所有的子进程修改默认行为:由options设置各种常量
WNOHANG:如果等待集合中无子进程终止,立刻返回0WUNTRACED:效果与默认累死,但最后返回的是导致返回的已终止或已停止的子进程的pidWCONTINUED:挂起调用的进程,直到等待集合中一个正在运行的进程终止,或等待集合中一个被停止的进程收到SIGCONT信号重新开始执行。WNOHANG | WUNTRACED的效果就是立即返回,如果有终止的返回其PID否则返回0**检查回收子进程的退出状态:**一个子进程退出的状态,存放在startup参数里,通过一下函数来解析:
WIFEXITED(status)如果子进程通过调用 exit 或者一个返回 (return)正常终止,就返回真WEXITSTATUS(status) 返回一个正常终止的子进程的退出状态。只有在WIFEXITED() 返回为真时,才会定义这个状态WIFSIGNALED(status): 如果子进程是因为一个未被捕获的信号终止的,那么就返回真。WTERMSIG(status): 返回导致子进程终止的信号的编号。只有在 WIFSIGNALED() 返回为真时,才定义这个状态。WIFSTOPPED(status): 如果引起返回的子进程当前是停止的,那么就返回真。WSTOPSIG(status): 返回引起子进程停止的信号的编号。只有在 IFSTOPPED()返回为真时,才定义这个状态。WIFCONTINUED(status): 如果子进程收到 SIGCONT 信号重新启动,则返回真。错误条件
如果调用进程没有子进程,那么waitpid返回-1, 并且设置errno为ECHILD。如果 waitpid函数被一个信号中断,那么它返回-1, 并设置errno为EINTR。
调用 wait(&status) 等价于调用waitpid(-1, &status, 0)