0


Linux笔记---进程:进程等待

1. 进程等待的概念

进程等待是指父进程通过系统调用

wait

waitpid

来对子进程进行状态检测与回收的功能。

当子进程退出时,如果父进程不读取子进程的退出状态,子进程就会成为僵尸进程,造成内存泄漏的问题。因此,父进程需要调用

wait

或者

waitpid

确认子进程的退出信息以回收僵尸进程的资源以防止内存泄漏。

进程等待的必要性

  1. 回收僵尸进程:子进程退出后,如果父进程不进行处理,子进程会变成僵尸进程,占用系统资源,可能导致内存泄漏。
  2. 获取子进程的退出情况:父进程可以通过进程等待获取子进程的退出码和退出信号,从而了解子进程的执行结果

2. 进程等待的方法

进程等待通过包含在头文件<sys/types.h>和<sys/wait.h>中的两个函数实现:**wait()waitpid()**。

wait和waitpid函数用于等待子进程,等待意味着等待为子进程收尸,父进程可能会在wait或waitpid处阻塞,等待子进程退出。

2.1 wait函数

pid_t wait(int* status);
  • 函数原型pid_t wait(int *status);
  • 功能:使调用的进程(通常是父进程)暂停执行,直到一个子进程终止或发生一个信号。
  • 参数status是一个输出型参数,用于存放子进程的终止状态,如果不关心子进程的退出状态,可以设置为NULL。
  • 返回值:如果有子进程退出,wait()返回子进程的PID,并可通过status指针获取子进程的退出状态;如果等待失败,则返回-1。

2.2 waitpid函数

pid_ t waitpid(pid_t pid, int *status, int options);
  • 函数原型pid_t waitpid(pid_t pid, int *status, int options);
  • 功能:提供更多的控制,允许父进程等待特定的子进程,或者是与父进程有特定关系的任何子进程。
  • 参数: > > - pid:指定要等待的子进程的PID;若为-1,则等待任何子进程,与wait等效。> - status:和wait一样,用于存放子进程的终止状态。> - options:可以控制waitpid的行为,该参数选择性传入,不传时行为与wait相同。 - WNOHANG:如果指定的子进程没有结束,waitpid函数不会阻塞(进程不会暂停等待子进程结束),而是立即返回0。- WUNTRACED:返回终止子进程信息和因信号停止的子进程信息。- WCONTINUED:返回收到SIGCONT信号而恢复执行的已停止子进程状态信息
  • 返回值: > > - 当正常返回的时候,waitpid返回收集到的子进程的进程ID。> - 如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0。> - 如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在。

2.3 status的用法

*status作为一个整型值,其四个字节的各个字段分别用于存储各类信息,我们可以将其看作位图。

我们并不需要记住哪些字段用于存储什么信息,如何解析,因为操作系统为我们定义了一系列的宏来对*status进行解析:

  1. WIFEXITED(status)- 功能:检查子进程是否正常退出。- 返回值:如果子进程通过调用exit_exit正常退出,则返回一个非零值。- 使用示例: if (WIFEXITED(status)) { printf("子进程正常退出\n");}
  2. **WEXITSTATUS(status)**:- 功能:获取子进程的退出状态码。- 返回值:返回子进程通过exit_exit系统调用设置的退出状态码。- 使用示例: if (WIFEXITED(status)) { int exit_status = WEXITSTATUS(status); printf("子进程的退出状态码是:%d\n", exit_status);}
  3. **WIFSIGNALED(status)**:- 功能:检查子进程是否因为接收到信号而异常终止。- 返回值:如果子进程因为接收到信号而终止,则返回一个非零值。- 使用示例: if (WIFSIGNALED(status)) { printf("子进程因为信号而异常终止\n");}
  4. **WTERMSIG(status)**:- 功能:获取导致子进程终止的信号编号。- 返回值:返回导致子进程终止的信号编号。- 使用示例: if (WIFSIGNALED(status)) { int signal_number = WTERMSIG(status); printf("导致子进程终止的信号编号是:%d\n", signal_number);}
  5. **WIFSTOPPED(status)**:- 功能:检查子进程是否因为接收到信号而暂停。- 返回值:如果子进程因为接收到信号而暂停,则返回一个非零值。- 使用示例: if (WIFSTOPPED(status)) { printf("子进程因为信号而暂停\n");}
  6. **WSTOPSIG(status)**:- 功能:获取导致子进程暂停的信号编号。- 返回值:返回导致子进程暂停的信号编号。- 使用示例: if (WIFSTOPPED(status)) { int stop_signal = WSTOPSIG(status); printf("导致子进程暂停的信号编号是:%d\n", stop_signal);}
标签: linux 笔记 服务器

本文转载自: https://blog.csdn.net/2302_80372340/article/details/144173323
版权归原作者 大筒木老辈子 所有, 如有侵权,请联系我们删除。

“Linux笔记---进程:进程等待”的评论:

还没有评论