结构问题中的指针

时间:2012-03-09 07:05:34

标签: c file pointers


我可能有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
}

1 个答案:

答案 0 :(得分:2)

看起来很多线程都可以访问您的my_thread_context_t::fp,这正是问题FILE*类型实际上是指向C库使用的结构的(不透明)指针。当多个线程修改它时,此结构内容可能会被破坏(或不一致)。您必须同步对my_thread_context_t::fp的访问权限。我建议在pthread_mutex_init结构中创建一个互斥锁(请参阅pthread_mutex_lockpthread_mutex_unlockctx)。每个线程应该在开始写入文件之前锁定它,并在完成写入时将其解锁 - 这个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之后)。