arrays - structure with pointer through FIFO pipe in C -
i trying setup fifo pipe 1 server , 1 client.
client.c
#include<stdio.h> #include<fcntl.h> #include<stdlib.h> #include<string.h> typedef struct buffer { int pid; char *buffer; } my_buffer; /* void removefifo() { unlink("fifo_server"); unlink("fifo_client"); } */ main(int argc, char *argv[]) { if (argc != 2) { fprintf(stderr, "usa: %s text \n", argv[0]); return exit_failure; } file *file1; int fifo_server,fifo_client; char *buf_in; buf_in = malloc(20*sizeof(char)); //send pid , content my_buffer * buf_out; buf_out = (my_buffer *)malloc(sizeof(my_buffer)); buf_out->pid = getpid(); buf_out->buffer = (char *) calloc(20,sizeof(char)); strcpy(buf_out->buffer,argv[1]); fifo_server=open("fifo_server",o_rdwr); if(fifo_server < 0) { printf("error in opening file"); exit(-1); } printf("buffer has pid %d , content %s \n",buf_out->pid,buf_out->buffer); write(fifo_server,buf_out,sizeof(struct buffer)); fifo_client=open("fifo_client",o_rdwr); if(fifo_client < 0) { printf("error in opening file"); exit(-1); } read(fifo_client,buf_in,10*sizeof(char)); printf("\n * reply server: %s * \n",buf_in); close(fifo_server); close(fifo_client); } server.c
#include<stdio.h> #include<fcntl.h> #include<stdlib.h> #include<string.h> #define fifo_mode (s_irusr | s_iwusr | s_irgrp | s_iroth) //0666 typedef struct buffer { int pid; char *buffer; } my_buffer; int main() { int fifo_server,fifo_client; char *buf_out; int i; int file1,file2; my_buffer * buf_in; buf_in = (my_buffer *)malloc(sizeof(my_buffer)); buf_in->buffer = (char *) calloc(20,sizeof(char)); buf_out = malloc(20*sizeof(char)); //create fifo-server p-flag file1 = mkfifo("fifo_server",fifo_mode); if(file1<0) { printf("fifo_server exists \n"); } fifo_server = open("fifo_server",o_rdwr); if(fifo_server<1) { printf("error opening file"); } read(fifo_server,buf_in,sizeof(struct buffer)); //read pid , content if(fifo_server<1) { printf("error opening file"); } printf("pid %d \n",buf_in->pid); printf("content %s \n",buf_in->buffer); //write strcpy(buf_out,buf_in->buffer); (i = 0; buf_in->buffer[i] != '\0'; i++) { buf_out[i] = toupper(buf_in->buffer[i]); } //create fifo-client p-flag file2 = mkfifo("fifo_client",fifo_mode); if(file2<0) { printf("fifo_client exists \n"); } fifo_client = open("fifo_client",o_rdwr); write(fifo_client,buf_out,10*sizeof(char)); printf("\n data sent client \n"); close(fifo_server); close(fifo_client); } i first start server, client. in particular, when run client
./client "the fox" buffer has pid 14491 , content fox the server correctly displays pid crashes @ printing buf_in->buffer.
./server pid 14491 errore di segmentazione kindly ask advice.
your struct buffer contains pointer among members. that's fine, need recognize whatever points to, if anything, not part of struct, , pointer at best invalid on other end of pipe. have 2 main alternatives:
give
structarray member instead of pointer member:typedef struct buffer { int pid; char buffer[20]; } my_buffer;be more careful how write data. example:
unsigned buf_size = strlen(buf_out.buffer); write(fifo_client, &buf_out.pid, sizeof(buf_out.pid)); write(fifo_client, &buf_size, sizeof(buf_size)); write(fifo_client, buf_out.buffer, buf_size);
naturally, latter must paired corresponding read mechanism.
Comments
Post a Comment