我可能有fp的指针问题,因为我得到(SIGSEGV)错误。
但我对C的经验并不多,我没有看到它。
我正在尝试做什么。我为简单的游戏做Server应用程序,我在新线程中处理客户端。我使用函数pthread_create,它有一个名为handle_client的句柄函数,我需要在一些争论中得到socketdescritpor(它工作)和filedescriptor来写日志(可能有问题)。
在我的主要文件中,我打开日志文件,然后将filedescriptor放到我的struct中,我在handle_client函数中得到struct,在这个函数中我想要找回日志文件的文件decriptor(fp
),能够写入文件。我使用fflush(fp)来保存每个fprintf之后的数据,我打开文件一次然后每个客户端应该能够通过这个描述符写入文件,但我可能用指针做了一些不好的事情(我的意思是geting {{1从结构进出,有一段我的代码,我做这个动作。)求助。
结构
fp
主
typedef struct
{
int fd;
FILE *fp; //filepointer for logs file
} my_thread_context_t;
hadle_client函数
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
}
答案 0 :(得分:2)
看起来很多线程都可以访问您的my_thread_context_t::fp
和,这正是问题。 FILE*
类型实际上是指向C库使用的结构的(不透明)指针。当多个线程修改它时,此结构内容可能会被破坏(或不一致)。您必须同步对my_thread_context_t::fp
的访问权限。我建议在pthread_mutex_init
结构中创建一个互斥锁(请参阅pthread_mutex_lock
,pthread_mutex_unlock
,ctx
)。每个线程应该在开始写入文件之前锁定它,并在完成写入时将其解锁 - 这个puprpose的单独(内联)函数将是更好的设计,例如:
typedef struct
{
int fd;
pthread_mutex_t mutex;
FILE *fp; //filepointer for logs file
} my_thread_context_t;
my_thread_context_t ctx;
fp = fopen("Serverlog.log","a+");
pthread_mutex_init(&ctx.mutex);
ctx.fp = fp;
inline void write_to_log(my_thread_context_t* pCtx,const char* pcszMessage)
{
pthread_mutex_lock(&(pCtx->mutex));
/* here write to the log file */
pthread_mutex_unlock(&(pCtx->mutex));
}
如果你这样做,它不仅安全,而且你也不必调用fflush
每次写入后(除非您希望您的日志始终保持同步)。
不要忘记在完成所有主题后调用pthread_mutex_destroy
(例如,在所有必要的ptrhead_join
之后)。