我不知道*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);
waitpid()
将在其中存储新状态。status
参数status参数是什么意思?以及为什么它是整数的[[pointer? 像指针一样传递变量通常是输出内容的另一种方法。
因此该函数实际上具有two输出:更改的pid(通过返回值)和新状态,该状态写在您提供给它的地址中(除非地址为NULL)。代码分析Config.CLIENTES
中定义的已知数量的客户端存在循环>程序等待每个客户端的状态更改,
stat_cliente
变量被该进程的新状态填充(实际上,它的地址是将int *
传递给waitpid()
)。 waitpid()
的返回值,如果出现错误,实际上可以返回-1。在这种情况下,stat_cliente
的值将毫无意义!
WIFEXITED()
宏正常退出WEXITSTATUS()
宏以获取退出状态Config.SERVICOS
的检查)增加了当前服务的已发现状态的特定计数器。确保所有子进程都通过waitpid()
正常终止。