1进程的回收:wait()和waitpid()函数。
pid_t wait(int *status):
1.功能:该函数可以阻塞等待任何子进程退出,并回收该进程的状态信息。一般用于父进程回收子进程。
2.参数:status表示进程退出时的状态。若参数为NULL,则代表不关心子进程的状态信息,此时函数只用于阻塞等待回收子进程。
3.返回值:若成功,则返回子进程的pid号,若失败,则返回-1
用于判断status的几个常用宏函数:
1.WIFEXITED(status) 是不是正常结束
2.WEXITSTATUS(status) 使用这个宏去拿返回值
3.WIFSIGNALED(status) 是不是收到了信号而终止的
4.WTERMSIG(status)如果是信号终止的,那么是几号信号。
注意:1和2,3和4是搭配使用的。
pid_t waitpid(pid,&status,options):
功能:用于回收子进程的资源,并获得子进程的结束信息。
参数:pid 表示要回收的进程号;status用于保存子进程的结束信息;options可选:0/WNOHANG. 若为0,则表示阻塞等待回收子进程的状态信息。若为WNOHANG,则表示非阻塞等待回收子进程的结束状态信息。非阻塞的意思是如果子进程没有结束,父进程不会一致阻塞在这里等待,而是继续执行它的指令。当子进程结束后,才会获得子进程的结束信息。
返回值:若指令执行成功并且子进程被回收,则为回收的子进程的pid;若指令执行成功但是子进程未被回收,则返回值未0;若执行失败,则未-1;
exec函数族:功能就是调用可执行文件替换当前执行程序的代码区和数据区。使得程序执行这个可执行文件。
int execl(const char *path, const char *arg, ...);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const arg[]) int execlp(const char *file, const char *arg, ...);
注意:1.必须是可执行文件。
2.execl和execv函数都会扫描当前路径。而另外两个不会,若在另外两个函数中只写当前路径下的文件名,函数会执行失败,因为若是文件的话,它默认会在PAHT 中去寻找此文件。
3.若想每次都执行成功,最好每个函数中都写路径加文件名。比如:在当前路径下有一个可执行文件,只需要写 “./filename”.则上面四个函数都能成功执行。