C 我应该如何在waitpid中使用*status(pid\u t pid,int*status,int选项)?

C 我应该如何在waitpid中使用*status(pid\u t pid,int*status,int选项)?,c,linux,status,waitpid,C,Linux,Status,Waitpid,我不明白状态应该做什么,或者他在做什么 下面有一个例子;你能解释一下统计客户在做什么吗 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

我不明白状态应该做什么,或者他在做什么

下面有一个例子;你能解释一下统计客户在做什么吗

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]++;
        }
    }
}
for(int i=0;i
正如广泛描述的那样,
waitpid()
是使父进程在
fork()之后等待子进程状态更改的函数之一。这主要用于正确终止子进程并释放它们的资源

没有必要复制完整的手册页面说明。就这么说吧

pid_t waitpid(pid_t pid, int *status, int options); 
  • pid是要等待的子进程的进程ID。这是将此函数与其“姐妹函数”区分开来的参数,因为它允许等待特定进程。嗯,它还允许等待一组进程;请阅读手册以了解更多说明
  • 状态。它是指向整数的指针,
    waitpid()
    将在其中存储新状态
  • 选项指定函数的行为(例如,允许在非阻塞模式下工作)。有关更详细的说明,请参阅手册

关于
状态
参数 那么,回答你的问题,状态参数的含义是什么?为什么它是指向整数的指针传递指针之类的变量通常是输出内容的另一种方式。

因此,该函数实际上有两个输出:更改的pid(通过返回值)和新状态,写入您提供给它的地址(除非地址为空)


代码分析
  • Config.clients
  • 程序等待每个客户端的状态更改,
    stat\u cliente
    变量填充该进程的新状态(实际上,它的地址是,
    int*
    被传递到
    waitpid()
    警告:没有检查
    waitpid()
    的返回值,如果出现错误,它实际上可能返回-1。在这种情况下,
    stat\u cliente
    的值将毫无意义
  • 程序通过
    WIFEXITED()
    宏检查子进程是否正常退出
  • 在正常终止的情况下,可以调用
    WEXITSTATUS()
    宏来检索退出状态
  • 对于有限的子进程子集(我认为,由于执行了对
    Config.SERVICOS
    的检查,因此被分类为服务的子进程)增加了当前服务的查找状态的特定计数器
  • 总之,本课程部分执行两项任务:

  • 它确保所有子进程通过
    waitpid()
    正常终止
  • 它更新了其中一个子集(称为“服务”)的统计表,以便沿着历史记录跟踪每个服务的所有可能终止原因的发生

  • 你看过报纸了吗?它确实很清楚地解释了这一点。如果你仍然不明白,请你更具体地说你不明白的部分是什么?非常感谢,我很难理解状态是如何工作的。我可以看到它是一个指针,但不理解它如何检索子进程的exit()。祝你有美好的一天!