Попытка записать буфер в файл, но продолжаю получать ошибки сегментации, и я не могу понять, почему - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть код, цель которого - открыть / создать файл, прочитать сообщения, а затем записать эти сообщения в открытый / созданный файл. Кажется, все, вплоть до записи в файл, работает нормально. Вот мой код.

#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;
}

allow_connections, accept_next_connection и read_msg - все из библиотеки, которая была предоставлена ​​мне. Я предполагаю, что моя проблема в recv_log_msgs, но я не уверен, что это будет.

1 Ответ

2 голосов
/ 05 ноября 2019

Вот корень вашей проблемы:

FILE *fp = log_fd;

log_fd - дескриптор файла, fp - указатель FILE. Они не являются взаимозаменяемыми, и вам нужно использовать системный вызов write(...) для записи в файл журнала или создать файл журнала другим способом, чтобы получить указатель FILE на него.

FILE *fp = fopen(argv[1], "w"), может сделать свое дело.

РЕДАКТИРОВАТЬ: Как @DarrenSmith указал мне в комментариях, вы также можете использовать fp = fdopen(log_fd, "w") и оставить остальной код как есть.

...