我应该如何在 waitpid(pid_t pid, int *status, int options) 中使用 *status?
How am I supposed to use *status in waitpid(pid_t pid, int *status, int options)?
我不明白 *status
应该做什么,或者他在做什么。
下面有一个例子;你能解释一下 stat_cliente
在做什么吗?
for(int i = 0; i < Config.CLIENTES; i++){
int stat_cliente;
waitpid(Ind.pid_clientes[i], &stat_cliente,0);
if(WIFEXITED(stat_cliente)){ // Se terminou normalmente WIFEXITED devolve true
int status = WEXITSTATUS(stat_cliente); // WEXITSTATUS devolve os 8 bits menos
if(status < Config.SERVICOS){ // significativos do status usado no
// exit do filho
Ind.servicos_recebidos_por_clientes[status]++;
}
}
}
正如广泛描述的 here,waitpid()
是使 父进程 等待 子进程的函数之一 fork()
后状态变化。这主要用于正确终止子进程并释放它们的资源。
无需复制完整的手册页说明。就说在
pid_t waitpid(pid_t pid, int *status, int options);
- pid是要等待的子进程的进程ID。这是将此函数与其 "sisters" 区分开来的参数,因为它允许等待 特定的 进程。好吧,它还允许等待 groups 个进程;阅读手册以获得进一步的说明。
- 状态。它是一个指向整数的指针,
waitpid()
将在其中存储新状态。
- options 指定函数的行为(例如允许在非阻塞模式下工作)。请参阅手册以获得更深入的解释。
关于status
参数
那么,为了回答您的问题,status 参数的含义是什么?为什么它是指向整数的指针? 传递指针等变量通常是另一种输出方式。
所以这个函数实际上有两个输出:改变的pid(通过return值)和新的状态,写在你提供给它的地址中(除非地址为空)。
代码分析
- 在
Config.CLIENTES
中定义的已知数量的客户端上存在循环
- 程序等待每个客户端的状态变化,
stat_cliente
变量填充那个进程的新状态(其实就是它的地址,一个int *
传给waitpid()
). 警告:没有检查 waitpid()
的 return 值,如果出现错误,实际上可能 return -1。在那种情况下 stat_cliente
的值将毫无意义!
- 程序通过
WIFEXITED()
宏检查子进程是否正常退出
- 如果正常终止,可以调用
WEXITSTATUS()
宏来恢复退出状态
- 对于子进程的有限子集(我想是那些被分类为服务的子集,因为执行了针对
Config.SERVICOS
的检查)增加当前服务的已找到状态的特定计数器。
总之,这个程序部分执行两个任务:
- 确保所有子进程通过
waitpid()
正常终止。
- 它为其中的一个子集更新了一个统计数据 table,称为 "services",以便沿着历史记录它们中的每一个的所有可能终止原因的发生。
我不明白 *status
应该做什么,或者他在做什么。
下面有一个例子;你能解释一下 stat_cliente
在做什么吗?
for(int i = 0; i < Config.CLIENTES; i++){
int stat_cliente;
waitpid(Ind.pid_clientes[i], &stat_cliente,0);
if(WIFEXITED(stat_cliente)){ // Se terminou normalmente WIFEXITED devolve true
int status = WEXITSTATUS(stat_cliente); // WEXITSTATUS devolve os 8 bits menos
if(status < Config.SERVICOS){ // significativos do status usado no
// exit do filho
Ind.servicos_recebidos_por_clientes[status]++;
}
}
}
正如广泛描述的 here,waitpid()
是使 父进程 等待 子进程的函数之一 fork()
后状态变化。这主要用于正确终止子进程并释放它们的资源。
无需复制完整的手册页说明。就说在
pid_t waitpid(pid_t pid, int *status, int options);
- pid是要等待的子进程的进程ID。这是将此函数与其 "sisters" 区分开来的参数,因为它允许等待 特定的 进程。好吧,它还允许等待 groups 个进程;阅读手册以获得进一步的说明。
- 状态。它是一个指向整数的指针,
waitpid()
将在其中存储新状态。 - options 指定函数的行为(例如允许在非阻塞模式下工作)。请参阅手册以获得更深入的解释。
关于status
参数
那么,为了回答您的问题,status 参数的含义是什么?为什么它是指向整数的指针? 传递指针等变量通常是另一种输出方式。
所以这个函数实际上有两个输出:改变的pid(通过return值)和新的状态,写在你提供给它的地址中(除非地址为空)。
代码分析
- 在
Config.CLIENTES
中定义的已知数量的客户端上存在循环
- 程序等待每个客户端的状态变化,
stat_cliente
变量填充那个进程的新状态(其实就是它的地址,一个int *
传给waitpid()
). 警告:没有检查waitpid()
的 return 值,如果出现错误,实际上可能 return -1。在那种情况下stat_cliente
的值将毫无意义! - 程序通过
WIFEXITED()
宏检查子进程是否正常退出 - 如果正常终止,可以调用
WEXITSTATUS()
宏来恢复退出状态 - 对于子进程的有限子集(我想是那些被分类为服务的子集,因为执行了针对
Config.SERVICOS
的检查)增加当前服务的已找到状态的特定计数器。
总之,这个程序部分执行两个任务:
- 确保所有子进程通过
waitpid()
正常终止。 - 它为其中的一个子集更新了一个统计数据 table,称为 "services",以便沿着历史记录它们中的每一个的所有可能终止原因的发生。