尝试将缓冲区写入文件,但不断出现分段错误,我不明白为什么

Trying to write a buffer to a file, but keep getting segmentation faults and I can't figure out why

我有一些代码,其目标是 open/create 一个文件,读取消息,然后将这些消息写入 opened/created 文件。写入文件之前的所有内容似乎都可以正常工作。这是我的代码。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include "message-lib.h"

int usage( char name[] );
void * recv_log_msgs( void * arg );
sem_t mutex;
int log_fd; 

void * recv_log_msgs( void * arg ){ 
    sleep(1);
    sem_wait(&mutex);
    char buffer[1024];
    int number_bytes_read;
    FILE *fp = log_fd;
    do{
        number_bytes_read = read_msg(arg, buffer, 1024);
        printf("in recv\n");
        printf(buffer);
        fwrite(&buffer, 1, sizeof(buffer)/sizeof(buffer[0]), fp);
    }while(number_bytes_read > 0);
    if(number_bytes_read == 0){
        close_connection(arg);
    }
    sem_post(&mutex);
    return NULL;
}

int usage( char name[] ){
    printf( "Usage:\n" );
    printf( "\t%s <log-file-name> <UDS path>\n", name );
    return 1;
}

int main( int argc, char * argv[] )
{
    int connection;
    pthread_t tid;
    if ( argc != 3 )
        return usage( argv[0] );

    log_fd = creat(argv[1], S_IRUSR | S_IWUSR);
    if(log_fd == -1){
        perror(argv[1]);
        return 1;
    }

    int listener = permit_connections(argv[2]);
    if(listener == -1){
        return -1;
    }
    sem_init(&mutex, 0, 1);
    do{
        connection = accept_next_connection(listener);
        if(connection == -1){
            return -1;
        }
        pthread_create(&tid, NULL, recv_log_msgs, connection);
    }while(connection != -1);

    close_connection(connection);    

    close_listener(listener);


    fclose(log_fd);

    return 0;
}

permit_connections、accept_next_connection 和 read_msg 都来自提供给我的图书馆。我猜我的问题出在 recv_log_msgs,但我不确定它会是什么。

这是问题的根源:

FILE *fp = log_fd;

log_fd是一个文件描述符,fp是一个FILE指针。 两者不可互换,您需要做的是使用 write(...) 系统调用写入日志文件,或者以其他方式创建日志文件以获取 FILE 指针

FILE *fp = fopen(argv[1], "w"),可能会成功。

编辑:正如@DarrenSmith 在评论中向我指出的那样,您也可以使用 fp = fdopen(log_fd, "w") 并保持其余代码不变。