Неявное объявление функции в C UNIX - PullRequest
3 голосов
/ 19 октября 2010

В следующем коде я получаю предупреждение о неявном объявлении функции getpgid. Я знаю, что это только предупреждение, но это для класса, и профессор хочет, чтобы мы воспринимали предупреждения как ошибки. Так что помогите пожалуйста.

Я также включил соответствующий заголовочный файл, так что понятия не имею, что не так:

#include <unistd.h>

pid_t pid, pgid;

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

Ответы [ 4 ]

4 голосов
/ 19 октября 2010

со страницы руководства :

Требования к макрокоманде тестирования функций для glibc (см. feature_test_macros(7)):

getpgid():
      _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
      || /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
2 голосов
/ 19 октября 2010

Наилучшее предположение со всеми допущениями: 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. Гарантирует, что другие могут воссоздать вашу трудность и, таким образом, диагностировать ее.

Часто подготовка к объяснению проблемы кому-то, кто не знаком с вашим проектом, вызываетисточник проблемы выпрыгнуть.

1 голос
/ 19 октября 2010

Для таких ошибок, зависящих от ОС / компилятора, вы должны предоставить нам дополнительную информацию о вашей платформе, вашем компиляторе и ваших флагах компилятора. Это не нормально, что ваша система имеет эту функцию и скрывает ее для вас. Возможно, вам не хватает какого-то флага компилятора.

В моем руководстве сказано, что getpgid следует избегать, если в этом нет необходимости, и заменить его более простой функцией POSIX getpgrp(void). Если это вариант для вас (вы просто делаете это для идентификатора самого процесса), вы должны сделать это окончательно.

0 голосов
/ 19 октября 2010

Смотрите в документации "getpgid", если нужен какой-то другой заголовок

...