我应该如何在waitpid中使用* status(pid_t pid,int * status,int options)?

问题描述 投票:1回答:1

我不知道*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]++;
        }
    }
}
c linux status waitpid
1个回答
1
投票

如广泛描述的herewaitpid()是使父亲进程等待fork()之后状态子进程状态改变的功能之一。这主要用于正确终止子进程并释放其资源。

无需重复完整的手册页说明。让我们在[

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

关于status参数

所以,要回答您的问题,

status参数是什么意思?以及为什么它是整数的[[pointer? 像指针一样传递变量通常是输出内容的另一种方法。

因此该函数实际上具有two输出:更改的pid(通过返回值)和新状态,该状态写在您提供给它的地址中(除非地址为NULL)。

代码分析


Config.CLIENTES中定义的已知数量的客户端存在循环>
    程序等待每个客户端的状态更改,stat_cliente变量被该进程的新状态填充(实际上,它的地址是将int *传递给waitpid())。
  1. 警告
  2. :不检查waitpid()的返回值,如果出现错误,实际上可以返回-1。在这种情况下,stat_cliente的值将毫无意义!

  • 程序检查子进程是否通过WIFEXITED()宏正常退出
  • 在正常终止的情况下,可以调用WEXITSTATUS()宏以获取退出状态
  • 对于子进程的有限子集(我认为是那些归类为服务的子进程,因为执行了对Config.SERVICOS的检查)增加了当前服务的已发现状态的特定计数器。
  • 结论,此程序部分执行两项任务:
  • 确保所有子进程都通过waitpid()正常终止。

      它为其中的一个子集(称为“服务”更新了一个统计表,以便沿着历史追踪每个事件的所有可能终止原因的发生。
    © www.soinside.com 2019 - 2024. All rights reserved.