我应该如何在 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]++;
        }
    }
}

正如广泛描述的 herewaitpid() 是使 父进程 等待 子进程的函数之一 fork() 后状态变化。这主要用于正确终止子进程并释放它们的资源。

无需复制完整的手册页说明。就说在

pid_t waitpid(pid_t pid, int *status, int options); 
  • pid是要等待的子进程的进程ID。这是将此函数与其 "sisters" 区分开来的参数,因为它允许等待 特定的 进程。好吧,它还允许等待 groups 个进程;阅读手册以获得进一步的说明。
  • 状态。它是一个指向整数的指针,waitpid() 将在其中存储新状态。
  • options 指定函数的行为(例如允许在非阻塞模式下工作)。请参阅手册以获得更深入的解释。

关于status参数

那么,为了回答您的问题,status 参数的含义是什么?为什么它是指向整数的指针传递指针等变量通常是另一种输出方式。

所以这个函数实际上有两个输出:改变的pid(通过return值)和新的状态,写在你提供给它的地址中(除非地址为空)。


代码分析

  1. Config.CLIENTES
  2. 中定义的已知数量的客户端上存在循环
  3. 程序等待每个客户端的状态变化,stat_cliente变量填充那个进程的新状态(其实就是它的地址,一个int *传给waitpid()). 警告:没有检查 waitpid() 的 return 值,如果出现错误,实际上可能 return -1。在那种情况下 stat_cliente 的值将毫无意义!
  4. 程序通过WIFEXITED()宏检查子进程是否正常退出
  5. 如果正常终止,可以调用WEXITSTATUS()宏来恢复退出状态
  6. 对于子进程的有限子集(我想是那些被分类为服务的子集,因为执行了针对 Config.SERVICOS 的检查)增加当前服务的已找到状态的特定计数器。

总之,这个程序部分执行两个任务:

  1. 确保所有子进程通过waitpid()正常终止。
  2. 它为其中的一个子集更新了一个统计数据 table,称为 "services",以便沿着历史记录它们中的每一个的所有可能终止原因的发生。