5

難しいことではありませんよね?右?

現在、pioctl のヘッダー定義を見つけるために OpenAFS コードベースを調べています。ctags をチェックしたり、pioctl のソース コードを grep したりなど、あらゆる手段を講じました。ユーザー空間コードには直接含まれておらず、Windows固有であるため、実際には私が望むものではありません。

さて、あなたが OpenAFS コードベースをダウンロードしてヘッダー ファイルを見つけてくれるとは思っていません。しかし、私は興味があります: 他のすべてが失敗したときに必要なヘッダー ファイルを見つけるためのテクニックは何ですか? コードベース内の pioctl の grep が実際に関数定義のように見えるものを思い付かない可能性がある最悪のシナリオは何ですか?

また、適切に実行された 2 つの独立したユーザー空間プログラムにアクセスできることにも注意してください。理論的には、関数の O(n) 検索を実行できます。しかし、ヘッダーファイルはどれも表示されず、n は大きいです...

編集:当面の問題は解決されました: pioctl() は、次のように暗黙的に定義されています:

AFS.xs:2796: error: implicit declaration of function ‘pioctl’
4

6 に答える 6

4

grep -rとが失敗している場合ctagsは、おそらくいくつかの厄介なマクロの結果として定義されています。pioctl()呼び出しとコンパイルが成功する最も単純なファイルを作成し、それを前処理して何が起こるかを確認できます。

gcc -E test.c -o test.i
grep pioctl -C10 test.i
于 2009-05-03T05:20:16.143 に答える
2

プリプロセッサの出力を表示するコンパイラ オプションがあります。それらを試してみませんか?私の頭が考えられる定義で完全に空っぽだった恐ろしいピンチでは、 -E オプション (ほとんどの c コンパイラで) は、前処理されたコードを吐き出すだけです。

要求された情報ごとに:通常、問題のファイルのコンパイルをキャプチャして画面に出力するだけで、すばやくコピーして貼り付け、コンパイラ呼び出しの直後に -E を配置します。結果はプリプロセッサの出力を画面に吐き出すので、ファイルにリダイレクトします。すべてのマクロとばかげたことはすでに処理されているので、そのファイルに目を通します。

最悪のシナリオ:

  • K&R スタイルのプロトタイプ
  • マクロが定義を隠している
  • 暗黙の宣言(あなたの答えによる)
于 2009-05-03T05:11:52.903 に答える
1

( SourceForgecscopeから入手可能) の使用を検討しましたか?

いくつかのかなり重要なコード セット (25,000 以上のファイル、ファイル内の最大約 20,000 行の範囲) で使用して、成功しています。古い Sun E450 で相互参照を作成するには、ファイル リストを取得するのに時間がかかり (5 ~ 10 分)、さらに時間がかかります (20 ~ 30 分) が、結果は役に立ちます。


ほぼ同じくらい古い Mac (デュアル 1GHz PPC 32 ビット プロセッサ) では、OpenAFS (1.5.59) ソース コードで cscope を実行すると、関数が宣言されている場所が非常に多く、コード内のインライン、ヘッダー内の場合もあります。 . 4949 個のファイルをスキャンして、58 MB の cscope.out ファイルを生成するのに数分かかりました。

  • openafs-1.5.59/src/sys/sys_prototypes.h
  • openafs-1.5.59/src/aklog/aklog_main.c (「なぜ AFS はこれらのプロトタイプを提供しないのですか?」というコメントと共に)
  • openafs-1.5.59/src/sys/pioctl_nt.h
  • openafs-1.5.59/src/auth/ktc.c には PIOCTL の定義が含まれています
  • openafs-1.5.59/src/sys/pioctl_nt.c はその実装を提供します
  • openafs-1.5.59/src/sys/rmtsysc.c はその実装を提供します (場合によっては afs_pioctl() 代わりに)

見つかった 184 個のインスタンスの残りは、関数の使用、ドキュメントの参照、リリース ノート、変更ログなどのようです。

于 2009-05-03T05:24:29.583 に答える
0

私たちが決定した現在の作業理論は、プリプロセッサーを調べても何も見つからなかった後、OpenAFS はコンパイラーに関数のプロトタイプを推測させているというものです。これは、整数を返し、ポインター、整数、ポインター、整数を取るためです。そのパラメータとして。自分で定義するだけでこれに対処します。

編集:素晴らしい!私は喫煙銃を見つけました:

AFS.xs:2796: error: implicit declaration of function ‘pioctl’
于 2009-05-03T05:34:21.273 に答える
0

元の一般的な質問には回答済みですが、pioctl を定義するヘッダー ファイルがどこにあるのか疑問に思ってこのページにたどり着いた場合は、次のようにします。

OpenAFS (1.6.7) の現行リリースでは、pioctl のプロトタイプが sys_prototypes.h で定義されています。しかし、この質問が最初に尋ねられた時点では、そのファイルは存在せず、OpenAFS コード ツリーの外部から見える pioctl のプロトタイプもありませんでした。

ただし、pioctl のほとんどのユーザーは、常にローカル マシンでシステム コールを発行する lpioctl (「ローカル」pioctl) を使用したいと考えているか、少なくとも使用しても問題ありません。このためのプロトタイプが afssyscalls.h (最近では sys_prototypes.h) にあります。

ただし、最近の最も簡単なオプションは、libkopenafs を使用することです。そのためには、kopenafs.h をインクルードし、関数 k_pioctl を使用して、-lkopenafs に対してリンクします。これは、OpenAFS libsys やその他のものとリンクしようとするよりもはるかに便利なインターフェイスになる傾向があります。

于 2014-05-10T19:44:25.143 に答える
-1

通常、manページの概要に記載されていませんか?

于 2009-05-03T05:26:22.667 に答える