我不明白*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]++;
}
}
}发布于 2020-04-04 13:03:10
正如广泛描述的这里,waitpid()是使父进程在fork()之后等待子进程状态更改的函数之一。它主要用于正确终止子进程并释放它们的资源。
没有必要复制完整的手册页面解释。我们就这么说吧
pid_t waitpid(pid_t pid, int *status, int options); waitpid()将在其中存储新状态。关于status参数
那么,要回答您的问题,状态参数的含义是什么?为什么它是一个指向整数的指针?传递变量(如指针)通常是输出某些内容的另一种方法。
因此,这个函数实际上有两个输出:更改的pid (通过返回值)和新的状态,它们以您提供的地址编写(除非地址为NULL)。
代码分析
Config.CLIENTES中定义的已知数量的客户机上有一个循环stat_cliente变量被该进程的新状态填充(实际上,它的地址,一个int *被传递给waitpid())。警告:没有检查waitpid()的返回值,如果出现错误,这实际上可以返回-1。在这种情况下,stat_cliente的价值将毫无意义!WIFEXITED()宏检查子进程是否正常退出。WEXITSTATUS()宏以撤回退出状态。Config.SERVICOS的检查是执行的),因此增加了当前服务的已发现状态的特定计数器。总结为,该程序部分执行两个任务:
waitpid()优雅地终止。https://stackoverflow.com/questions/61027539
复制相似问题