2010-10-19 4 views
3

Dans le code suivant, j'obtiens un avertissement qu'il existe une déclaration implicite de la fonction getpgid. Je sais que c'est seulement un avertissement, mais c'est pour une classe et le professeur veut que nous considérions les avertissements comme des erreurs. Alors, aidez s'il vous plait.Déclaration implicite de fonction dans C UNIX

J'ai inclus le fichier d'en-tête approprié et donc je ne sais pas ce qui est erroné:

#include <unistd.h> 

pid_t pid, pgid; 

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

Sur quelle plate-forme est-ce spécifique? Et, est-ce l'échantillon entier, ou votre code est-il dans une fonction réelle? – Joe

+0

http://bugs.php.net/bug.php?id=32045 a quelques indices –

+0

Son code dans une fonction réelle, je n'ai pas inclus la fonction complète puisque c'était la seule partie qui causait des problèmes et son sur UNIX – DemonicImpact

Répondre

4

De l'man page:

test Feature Exigences pour les macros glibc (voir feature_test_macros(7)):

getpgid(): 
     _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED 
     || /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809L 
+0

Qu'est-ce que cela signifie? Désolé, je suis un peu novice en programmation ... enfin, en quelque sorte. – DemonicImpact

+0

Que vous devez définir quelques macros pour que le prototype soit disponible pour votre code. Voir aussi la page man référencée (feature_test_macros (7)). – vanza

+0

Cela signifie-t-il que je dois inclure les lignes suivantes avant mes instructions include? #define _XOPEN_SOURCE #define _XOPEN_SOURCE_EXTENDED – DemonicImpact

0

Voir dans la documentation « getpgid » s'il y a une autre tête nécessaire

2

Meilleure estimation avec toute l'élision: pid_t est indéfini. Vous avez besoin des deux

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

Sinon, vous ne comprenez pas ce que vous pensez obtenir.

Il aurait été plus utile de fournir le plus petit fichier source qui a échoué de la même manière. Par exemple, ce qui suit (une élaboration minimale de votre texte) ne génère pas l'avertissement que vous décrivez pour moi sur le premier système que j'ai essayé.

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

La réduction de raison d'un cas de défaut minimale est importante:
1. Veiller à ce que vous avez suffisamment isolé le problème. Fréquemment, cette étape rend la cause évidente. Cela aide également à éliminer les fausses pistes.
2. S'assure que les autres peuvent recréer votre difficulté et ainsi diagnostiquer.

Souvent, l'exercice de préparation pour expliquer clairement un problème à quelqu'un qui n'est pas familier avec votre projet fait bondir la source du problème.

+1

Non, [' unistd.h'] (http://opengroup.org/onlinepubs/007908799/xsh/unistd.h.html) est garanti de définir 'pid_t', et il recevrait un avertissement différent s'il ne l'était pas. Mais le cas d'échec minimal est un bon conseil général. –

+0

Vous avez raison. J'ai écrémé The GNU C Library: Process Identification au lieu de plonger dans unistd.h. –

+0

+1 pour montrer à quoi pourrait ressembler un cas de test minimal. Je ne peux pas assez souligner à quel point cette technique peut être puissante, et à quel point c'est important quand on tente de signaler un bug. – RBerteig

1

Pour de telles erreurs dépendantes du système d'exploitation/du compilateur, vous devez nous fournir de manière définitive plus d'informations sur votre plate-forme, votre compilateur et vos indicateurs de compilation. Il n'est pas normal que votre système ait cette fonction et vous le cache. Il vous manque probablement un drapeau de compilateur.

Mon manuel indique que getpgid doit être évité si ce n'est pas nécessaire et être remplacé par la fonction POSIX plus simple getpgrp(void). Si c'est une option pour vous (vous faites cela pour l'identifiant du processus lui-même), vous devriez le faire définitivement.

+0

Il a cessé de me donner une erreur quand j'ai fait ce que la meilleure réponse a suggéré et ajouté la macro de test ... Cependant, je pense que je peux utiliser plutôt getpgrp. – DemonicImpact

+1

@DemonicImpact: bien sûr, la solution indiquée est en quelque sorte une solution pour contourner le problème. "Naturellement" votre compilateur devrait savoir quelle version de POSIX votre système est conforme, et faire la bonne chose par lui-même. –

Questions connexes