尝试将缓冲区写入文件,但不断出现分段错误,我不明白为什么
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")
并保持其余代码不变。
我有一些代码,其目标是 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")
并保持其余代码不变。