首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该如何使用*状态在等待pid(pid_t pid,int *状态,int选项)?

我应该如何使用*状态在等待pid(pid_t pid,int *状态,int选项)?
EN

Stack Overflow用户
提问于 2020-04-04 11:40:39
回答 1查看 705关注 0票数 1

我不明白*status应该做什么,或者他在做什么。

下面有一个例子,您能解释一下stat_cliente在做什么吗?

代码语言:javascript
复制
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]++;
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-04 13:03:10

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

没有必要复制完整的手册页面解释。我们就这么说吧

代码语言:javascript
复制
pid_t waitpid(pid_t pid, int *status, int options); 
  • pid是要等待的子进程的进程ID。这是将此函数与其“姐妹”区别开来的参数,因为它允许等待特定的进程。好的,它还允许等待一组进程;阅读手册以获得进一步的澄清。
  • status.它是一个指向整数的指针,waitpid()将在其中存储新状态。
  • options指定函数的行为(例如允许在非阻塞模式下工作)。有关更深层次的解释,请参阅手册。

关于status参数

那么,要回答您的问题,状态参数的含义是什么?为什么它是一个指向整数的指针?传递变量(如指针)通常是输出某些内容的另一种方法。

因此,这个函数实际上有两个输出:更改的pid (通过返回值)和新的状态,它们以您提供的地址编写(除非地址为NULL)。

代码分析

  1. Config.CLIENTES中定义的已知数量的客户机上有一个循环
  2. 程序等待每个客户端的状态变化,stat_cliente变量被该进程的新状态填充(实际上,它的地址,一个int *被传递给waitpid())。警告:没有检查waitpid()的返回值,如果出现错误,这实际上可以返回-1。在这种情况下,stat_cliente的价值将毫无意义!
  3. 程序通过WIFEXITED()宏检查子进程是否正常退出。
  4. 在正常终止的情况下,可以调用WEXITSTATUS()宏以撤回退出状态。
  5. 对于一个有限的子进程子集(我认为,由于对Config.SERVICOS的检查是执行的),因此增加了当前服务的已发现状态的特定计数器。

总结为,该程序部分执行两个任务:

  1. 它确保所有子进程通过waitpid()优雅地终止。
  2. 它更新了一个名为"services“的子集的统计表,以便沿着历史跟踪每个服务的所有可能终止原因的发生。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61027539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档