4

在以下代码中,我收到一条警告,指出函数 getpgid 存在隐式声明。我知道这只是一个警告,但它是针对班级的,教授希望我们将警告视为错误。所以,请帮忙。

我也包含了适当的头文件,所以我不知道出了什么问题:

#include <unistd.h>

pid_t pid, pgid;

if ((pgid = getpgid(pid)) < 0) {
      app_error("Failure to get process group ID");
}
4

4 回答 4

4

手册页

glibc 的功能测试宏要求(请参阅 参考资料feature_test_macros(7)):

getpgid():
      _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
      || /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
于 2010-10-19T03:03:31.377 回答
2

所有省略的最佳猜测: pid_t 未定义。你需要两者

#include <sys/types.h>  
#include <unistd.h>  

否则你不会得到你认为你得到的东西。

提供以相同方式失败的最小源文件会更有帮助。例如,在我尝试的第一个系统上,以下内容(对您的文本的最小化阐述)不会产生您为我描述的警告。

#include <unistd.h>
#include <stdio.h>
int main() {
     pid_t pid, pgid;
     if((pgid = getpgid(pid)) < 0) {
          puts("Oops.");
     }
     return 0;
}

将原因减少到最小的失败案例很重要:
1. 确保您已充分隔离问题。通常,此步骤会使原因显而易见。它还有助于消除虚假线索。
2. 确保其他人可以重现您的困难,从而诊断它。

通常,准备向不熟悉您的项目的人清楚地解释问题的练习会导致问题的根源跳出。

于 2010-10-19T03:36:03.000 回答
2

对于此类依赖于操作系统/编译器的错误,您应该明确地向我们提供有关您的平台、编译器和编译器标志的更多信息。你的系统有这个功能并且对你隐藏是不正常的。您可能缺少一些编译器标志。

我的手册说,getpgid如果没有必要,应该避免这种情况,并用更简单的 POSIX 函数代替getpgrp(void)。如果这是您的选择(您只是为流程本身的 id 执行此操作),您应该明确地这样做。

于 2010-10-19T06:43:18.827 回答
0

如果需要其他标头,请参阅“getpgid”文档

于 2010-10-19T03:02:57.167 回答