【问题标题】:How am I supposed to use *status in waitpid(pid_t pid, int *status, int options)?我应该如何在 waitpid(pid_t pid, int *status, int options) 中使用 *status?
【发布时间】:2020-04-04 11:40:39
【问题描述】:

我不明白*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]++;
        }
    }
}

【问题讨论】:

  • 你读过waitpid man page吗?它确实在那里解释得很清楚。如果还是不明白,能不能具体说一下你不明白的部分?

标签: c linux status waitpid


【解决方案1】:

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

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

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

关于status参数

那么,回答你的问题,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. 它会为其中的一个子集(称为“服务”)更新一个统计表,以便沿着历史记录跟踪每个服务的所有可能终止原因的发生。

【讨论】:

  • 非常感谢,我无法理解 status 的工作原理。我可以看到它是一个指针,但不理解它如何检索子进程的 exit()。祝你有美好的一天!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-15
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 2018-02-13
  • 1970-01-01
相关资源
最近更新 更多