在Unix/Linux系统中,fork()是创建新进程的常用函数。当一个进程调用fork()函数时,操作系统会在这个进程的地址空间内创建一个新进程,这个新进程的执行流程和原进程完全一样。而这两个进程的执行是并发的,任何一个进程都可能率先执行,它们之间的先后顺序是不可控的。
但是,在某些场景下,我们需要在原进程等待新进程执行完毕之后,再进行下一步操作。这时候,就需要对进程进行等待了。本文将详细阐述进程fork()后应该使用哪些函数进行等待。
wait()函数是一个阻塞函数,用于等待子进程结束。当使用wait()函数时,调用它的父进程将一直阻塞,直到任意一个子进程结束并获取到了它的终止状态。该函数返回结束的子进程的进程ID,或者-1表示出错。
在调用wait()函数之前,必须确保已经创建了至少一个子进程。否则wait()函数可能陷入无限等待的状态。严格地说,wait()函数应该和fork()函数结合使用,因为只有在创建子进程后,父进程才有必要等待子进程结束。
与wait()函数类似,waitpid()函数也是一个阻塞函数,用于等待指定的子进程结束。但是,与wait()函数不同的是,waitpid()函数具有更多的参数,可以更加灵活地控制等待子进程的条件。waitpid()函数的返回值有如下三种情况:
waitid()函数用于等待指定的子进程结束,并返回该进程的相关状态。与waitpid()函数不同的是,waitid()函数的参数更加灵活,可以选择等待指定的子进程,等待所有子进程,或者等待一个特定类型的子进程。
waitid()函数的返回值是一个结构体,包含了该子进程的PID、终止状态、以及是由于什么原因退出的等信息。如果出错,则返回-1。
wait3()和wait4()函数都是在wait()函数基础上扩展而来的。这两个函数都允许用户在子进程退出时获取更加详细的信息,例如其终止状态、使用的CPU时间、等待处理的信号等等。但是,由于这些函数的参数较多,使用起来不够方便,常常被更为方便的waitpid()或waitid()函数所替代。