第八章中出现了很多的函数,为了接下来的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
:效果与默认累死,但最后返回的是导致返回的已终止或已停止的子进程的pid
WCONTINUED
:挂起调用的进程,直到等待集合中一个正在运行的进程终止,或等待集合中一个被停止的进程收到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)