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

このような OS / コンパイラに依存するエラーについては、プラットフォーム、コンパイラ、およびコンパイラ フラグに関する詳細情報を明確に提供する必要があります。あなたのシステムがこの機能を持っていて、あなたにそれを隠すのは普通ではありません. コンパイラ フラグが欠落している可能性があります。

私のマニュアルには、getpgid必要がなければ避けるべきであり、より単純な POSIX 関数に置き換える必要があると書かれていますgetpgrp(void)。これがオプションである場合(プロセス自体のIDに対してこれを行っているだけです)、間違いなくそれを行う必要があります。

于 2010-10-19T06:43:18.827 に答える
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 に答える
0

他に必要なヘッダーがある場合は、「getpgid」のドキュメントを参照してください

于 2010-10-19T03:02:57.167 に答える