正在尝试将缓冲区写入文件,但是不断出现分段错误,我不知道为什么

问题描述 投票:0回答:1

我有一些代码,其目标是打开/创建文件,读入消息,然后将这些消息写到打开/创建的文件中。直到写入文件为止的所有工作似乎都很好。这是我的代码。

#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中,但是我不确定会是什么。

c file pthreads fwrite
1个回答
0
投票

这是您问题的根源:

FILE *fp = log_fd;

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

© www.soinside.com 2019 - 2024. All rights reserved.