4

fclose() が segfault を引き起こしています。私は持っている :

char buffer[L_tmpnam];
char *pipeName = tmpnam(buffer);
FILE *pipeFD = fopen(pipeName, "w"); // open for writing
...
...
...
fclose(pipeFD); 

私は...でファイル関連のことをしていないので、影響はありません。ただし、私の MAIN プロセスは、pipeName が格納されている共有メモリを介して別のプロセスと通信します。他のプロセス fopen はこのパイプを読み取り、MAIN と通信します。

これがセグメンテーション違反を引き起こしている理由はありますか?

ありがとう、フリスト

4

3 に答える 3

2
  1. に渡しpipeFDますfclose。filename ではなくfcloseファイルハンドルでファイルを閉じます。C では (C++ とは異なり)、ポインター型の暗黙的な型変換 (この場合は char* から FILE* へ) を行うことができるため、バグの原因はそこにあります。FILE*char*

  2. を呼び出す前に、pepeFD が非 NULL かどうかを確認してくださいfclose

編集: エラーが fopen の失敗によるものであることを確認しました。次のようにエラーを確認する必要があります。

 pipeFD = fopen(pipeName, "w");
 if (pipeFD == NULL)
 {
   perror ("The following error occurred");
 }
 else
 {
   fclose (pipeFD);
 }

出力例:

次のエラーが発生しました: そのようなファイルまたはディレクトリはありません

于 2010-04-03T20:44:57.843 に答える
2

fclose でのクラッシュは、渡された FILE * がなんらかの理由で破損していることを意味します。これは、ポインター自体が破損している場合 (デバッガーをチェックして、fopen によって返された値と同じ値が fclose にあることを確認してください)、または FILE データ構造がランダムなポインター書き込みまたはどこかでのバッファー オーバーフローによって破損した場合に発生する可能性があります。 .

valgrindまたはその他のメモリ破損チェッカーを使用して、何かわかるかどうかを確認できます。または、pipeFD 変数のアドレスでデバッガーのデータ ブレークポイントを使用します。FILE 自体でデータ ブレークポイントを使用するのは、複数の単語があるため注意が必要であり、通常のファイル I/O 操作によって変更されます。

于 2010-04-03T20:52:53.047 に答える
1

pipeName の代わりに pipeFD を閉じる必要があります。

于 2010-04-03T20:43:59.360 に答える