2010-12-20 1 views
7

私はreadonlyモード(r)でファイルを開くためにCプログラムで 'fopen'を使いました。しかし、私の場合、私はfopen呼び出しが返されないことを観察しました。それはNULLまたは有効なポインタを返しません - fopen呼び出しでブロックがブロックされます。ファイルのパッチは絶対に正しいです(私はすでにそれを確認しています)、権限に関する問題はありません。誰でもこの種の理由が何であるかを教えてください。あらゆる種類の助けが本当に感知できる。 gccやglibcに関連するものはありますか?ここでfopenが返さない

EDIT

は、私はこのコードを実行すると、私は唯一の(のfopenを呼び出す前に)最初の印刷を取得し、そのプログラムがちょうど停止後のサンプルコード

printf("%s %d\n",__FUNCTION__,__LINE__); 
if ((fp = fopen(argv[1], "r")) == NULL) { 
    printf("%s %d\n",__FUNCTION__,__LINE__); 
    return; 
} 
printf("%s %d\n",__FUNCTION__,__LINE__); 

です。だから、fopenはその操作を完了しません。このファイルは拡張子が「.conf」のシンプルな構成ファイルで、このファイルはvi、catなどのその他の手段で開くことができます。NFS関連の問題はありません。ファイルシステムはext3です。事前に

おかげで、 Souvik

+5

コードを投稿してください。私たちはそれなしではわかりません。 fopenに渡すパラメータ(値付き)を含めます。 –

+0

シナリオにサンプルコードを投稿することはできません。 – Sudantha

+0

ファイルシステムのタイプも指定してください。 – Simone

答えて

2

だから何? fopenは、ファイルが開かれるか、またはアクセスが拒否されたと判断されるまで、ブロックすることができます。あなたが低速の記憶装置を持っているなら、それが利用可能になるまで待つのは間違いありません。しかしそれはCのものではなく、オペレーティングシステムの問題です。

1

ファイルを正常に開くと、ファイルを閉じないことがわかります。

以前に実行して終了した可能性はありますか?ファイルが開いてロックされているプロセスがありますか?

もしそうなら、おそらくfopenがロックが解放されるのを待っています。

+2

興味深い考えですが、そこにはロックコードはありません。 Windowsでも、読み取り専用モードで複数のプロセスでファイルを開くことができます。この質問はLinuxにタグ付けされており、Linuxはこの意味でさらに寛容です。また、他のプログラムがそのファイルを開くことができると言っています。 –

+1

多少の関連性:オープンファイルリストロックのmutex上にメモリ破損が書き起こされ、 'fopen'が' pthread_mutex_lock'または同等のファイルに永久にハングアップする可能性があります。 OPが答えを聞いて「strace」だけを実行すると、これはすぐに確認されたり、反論されたりする可能性があります。 –

+0

@R ..:これは非常に良い所見です。 –

-1

予約された名前空間にシンボルを再定義した可能性はありますか?アンダースコアが2つで始まるもの、アンダースコアと大文字、または標準のCライブラリ関数のいずれかですか?その場合、結果として未定義の動作が発生し、fopenが、標準ライブラリの正しいコードではなく、コードの一部を呼び出してしまう可能性があります。

この質問には、「情報が不足しています」という大きな匂いがあります。私は真剣に疑問のコードスニペットがOPがそれ自身でmainに表示されるときの動作を記述していることを疑う、私はOPが私たちに語っていないいくつかの偽のものを行っていないのだろうか...

+0

コメントである必要があります。 – Stargateur

5

理由:

  • (valgrindのを通して、あなたのプログラムを実行する)あなたがどこかのメモリを破損しました、そして、すべてのベットは何が起こっているかのようにオフになっている
  • あなたはfopenのシグナルハンドラ、(内部でこのコードを呼び出している)ではありませんシグナルが非同期で安全なので、実際に何かが起こる可能性があります(FILE *内部ミューテックスによるデッドロックは一般的ですが)
  • ファイルはfifoです。ファイルを開くと誰かがファイルを開くまでブロックされます(読み取り/書き込み)
  • ファイルは古いNFSマウントです。
  • ファイルは、何か面白いことが起こるまでブロックを開くセマンティクスを持つ文字/ブロック特殊ファイルです。
+0

他のPCで同じコードを試してみましたが、うまくいきました。私のPCに何が間違っていたのか分かりません。とにかく、すべての助けと提案に感謝します。 – Souvik

関連する問題