1、系统调用的介绍一 . 进程创建 fork函数原型:#include pid_t fork(void)pid_t是一个 unisigned int,是进程号对应的数据类型。“fork”的意思就是一分为二,把当前进程复制出一个新的进程。当前的进程就是新进程的父进程,新进程称为子进程。fork把子进程 ID返回给父进程,把 0返回给子进程,通过对返回值的检查就可知道当前是父进程还是子进程。 一般结构:if (pid = fork() 0)parents code;else if (pid = 0)childs code;elseerror handling; 父进程打开的文件描述字将被子进程继承。
2、一个进程创建子进程时 ,父进程和子进程都从fork后的那个点开始继续执行。 获得当前进程 id: getpid() 获得父进程 id: getppid()函数原型:#include pid_t getpid(void);pid_t getppid(void);二 . Wait系统调用 父进程创建子进程后,可以通过执行 wait或 waitpid一直阻塞到子进程结束。 Wait函数会使调用者的执行挂起,直到:( 1)子进程的状态改变( 2)或调用者收到一个信号为止。#include pid_t wait (int *stat_loc);pid_t waitpid(pid_t,int *stat_
3、loc,int option);在什么情况下,子进程的状态改变? 子进程终止 子进程被一信号终止 子进程被一信号 resumed。当一进程终止时,执行 wait系统调用,能释放子进程的资源;否则,该子进程就成为一僵进程( zombie)状态。 返回值:成功: (一个子进程结束): 0(子进程的 pid)失败: (出现错误): -1(并设置全局变量 errno)0: waitpid使用参数 WNOHANG时,没有检测到终止的子进程。各种错误情况:( 1)调用者没有要等待的进程( wait); pid指定的进程或进程组不存在;或者 pid指定的进程组中没有哪个成员是调用者的子进程( waitpid
4、)。( 2)函数被信号中断。( 3) waitpid的参数 options是无效的。pid_t wait (int *stat_loc);当进程调 wait,它将进入睡眠状直到有一个子进程状态改变。wait函数正常时,返回子进程的进程 id, stat_loc返回子进程的退出状态值所在单元的指针。子进程调用 exit 或return 来设置这个状态值。如: exit(1);或 return 1;pid_t waitpid(pid_t,int *stat_loc,int option);waitpid的第一个参数 pid的意义:pid 0: 等待进程 id为 pid的子进程。pid = 0: 等待与自己同组的任意子进程。pid = -1: 等待任意一个子进程pid -1: 等待进程组号为 -pid的任意子进程。因此, wait(waitpid第三个参数 option可以是 0,WNOHANG, WUNTRACED或它们的按位或( ”|”)。wait 或 waitpid是因为子进程的状态被报告而返回的,若用选项 WNOHANG调用waitpid,表示 return immediately if no child has exited,立即返回 0。即如果没有结束的子进程函数立即返回 0。