私はおそらく(SIGSEGV)エラーが発生するため、fpのポインタの問題があります。 しかし私はCであまり経験はありませんし、私はそれを見ません。ポインタの構造体の問題
私がやろうとしていること。私は単純なゲームのためのサーバーアプリケーションを行う、私は新しいスレッドでクライアントを処理します。私は関数pthread_createを使用し、handle_clientというハンドル関数を持っています。いくつかのargumets socketdescritpor(動作します)とログを書き込むためのfiledescriptor(おそらく問題があります)を取得する必要があります。 私のメインではログファイルを開いて、私は構造体にfiledescriptorを入れ、handle_client関数内に構造体を入れ、この関数でログファイルのファイルデクリプタ(fp
)を取得したいファイルに書き込む。私は各fprintfの後にデータを保存するためにfflush(fp)を使います。ファイルを一度開き、各クライアントがこのdescriporをファイルに書き込むことができるはずですが、おそらくポインターで何か悪いことをしました(私はfp
を構造体から出て、私がこのアクションを行うところに私のコードがあります。)Thx for help。
構造体
typedef struct
{
int fd;
FILE *fp; //filepointer for logs file
} my_thread_context_t;
メイン
int main(int argc, char *argv[]) {
FILE * fp;
fp = fopen("Serverlog.log","w");//delete last file
fclose(fp);
fp = fopen("Serverlog.log","a+");
my_thread_context_t ctx;
//bind server
//listen
while(1) {
//accept
ctx.fp = fp;// add file pointer to structure
int check = pthread_create(&thread, NULL,handle_client,&ctx);
//other code
}
hadle_client機能
void * handle_client(void * void_context){
my_thread_context_t * context = (my_thread_context_t *) void_context;
FILE *fp; //pointer na soubor s logy
fp = context->fp;//get the filepointer for logs
//other code ..
}
デバッガでプログラムを実行しようとしましたか?クラッシュの位置を特定するのに役立ちます。また、何が間違っているかを見るのに役立つ変数を調べるのに役立ちます。 –
'gdb'や他のデバッガを使ってコードが失敗する箇所を知ることができます。また、エラーを分離するには、最初に疑わしいコードセグメントをスレッドなしで実行してください。 – phoxis
一般に、あるスレッドでファイルを開き、別のスレッドからファイルを処理するには、奇妙なプログラム設計が行われます。私はちょうど推測していますが、お使いのOSの内部動作に応じて、これが原因かもしれません。スレッド内からファイルを開こうとします。また、fopen()、fprintf()などの関数はスレッドセーフではないので、それらを使って複数のスレッドを持つことはできません。 – Lundin