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:

  1. give struct array member instead of pointer member:

    typedef struct buffer {     int pid;     char buffer[20]; } my_buffer; 
  2. 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

Popular posts from this blog

java - Spring Data JPA: Why findOne(id) executing delete query internally? -

python - Mongodb How to add addtional information when aggregating? -

java - Incorrect order of records in M-M relationship in hibernate -