C 结构问题中的指针

C 结构问题中的指针,c,file,pointers,C,File,Pointers,我可能有fp的指针问题,因为我得到(SIGSEGV)错误。 但是我对C语言没有太多的经验,我也看不到它 我想做的事。我做简单游戏的服务器应用程序,我用新线程处理客户端。我使用函数pthread_create,它有一个名为handle_client的handle函数,我需要输入一些参数socketdescriptor(它可以工作)和filedescriptor来编写日志(可能有问题)。 在main中,我打开日志文件,然后将filedescriptor放入结构中,在handle_client函数中获


我可能有fp的指针问题,因为我得到(SIGSEGV)错误。 但是我对C语言没有太多的经验,我也看不到它

我想做的事。我做简单游戏的服务器应用程序,我用新线程处理客户端。我使用函数pthread_create,它有一个名为handle_client的handle函数,我需要输入一些参数socketdescriptor(它可以工作)和filedescriptor来编写日志(可能有问题)。 在main中,我打开日志文件,然后将filedescriptor放入结构中,在handle_client函数中获取结构,在这个函数中,我想获取日志文件的文件描述符(
fp
),以便能够写入文件。我使用fflush(fp)在每次fprintf之后保存数据,我打开文件一次,然后每个客户机都应该能够通过这个描述符写入文件,但是我可能对指针做了一些不好的事情(我的意思是从结构中获取
fp
in和out,在我的代码中有一段代码可以执行此操作。)Thx寻求帮助

结构

 typedef struct
    {
        int fd;
        FILE *fp; //filepointer for logs file
    } my_thread_context_t;
主要

hadle_客户端函数

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 ..

}

看起来很多线程都可以访问您的
my\u thread\u context\u t::fp
,这正是问题所在。
文件*
类型实际上是指向C库使用的结构的(不透明)指针。当多个线程修改此结构时,它的内容可能会损坏(或不一致)。您必须同步访问您的
我的线程\u上下文\u t::fp
。我建议在
ctx
结构中创建一个互斥锁(请参见
pthread\u mutex\u init
pthread\u mutex\u lock
pthread\u mutex\u unlock
)。每个线程都应该在开始写入文件之前将其锁定,并在完成写入后将其解锁-为这个purpose提供一个单独的(内联)函数将是更好的设计,例如:

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\u mutex\u destroy
(例如,在所有必要的
ptrhead\u join
s之后)。

您是否尝试在调试器中运行该程序?它将帮助您精确定位崩溃的位置,还可以让您检查变量,以帮助您查看可能的错误。使用
gdb
或其他调试器来了解代码在哪一点失败。另外,为了隔离错误,首先在没有线程的情况下运行可疑代码段。通常,在一个线程中打开一个文件,然后在另一个线程中执行文件处理看起来很奇怪。我只是猜测,但根据操作系统的内部工作原理,这可能是原因。尝试从线程内部打开文件。另外请注意,fopen()、fprintf()等函数不是线程安全的,因此不能有多个线程使用它们。如果您不熟悉gdb,假设您是在Linux中开发的,那么您可以随时查看本教程。
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));
}