Laendor86

File_esercitation v3

Apr 22nd, 2021 (edited)
283
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /******************************************************************************
  2. Scrivere un programma che esegue i seguenti passi rispettando l’ordine
  3. 1)apre un file F in R/W e quindi mantiene il suo descritore
  4. 2)fork-a un nuovo processo che ottiene un mesaggio dall’utente da tastiera e lo scrive sul file F
  5. 3)legge dal file F il messaggio che ha scritto il processo figlio e lo stampa sul terminale
  6. ******************************************************************************/
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <fcntl.h>
  11. #include <unistd.h>
  12. #include <string.h>
  13. #include <sys/types.h>
  14. #include <sys/wait.h>
  15.  
  16. void err(char *message);
  17. int write_on_file(int fd);
  18. void read_last_message_from_file(int fd);
  19.  
  20. int main(int argc, char* argv[]){
  21.     int rc, fd;
  22.     pid_t pid;
  23.     char filename[25];
  24.     char *message;
  25.    
  26.     printf("Insert name of file: ");
  27.     fgets(filename,100,stdin);
  28.     int i;
  29.     for(i=0;filename[i]!='\n';i++);
  30.     filename[i]='\0';
  31.  
  32.     rc = open(filename, O_RDWR | O_APPEND | O_CREAT, 0666);
  33.     if (rc<0) err("open file");
  34.     fd = rc;
  35.    
  36.     rc = fork();
  37.     if (rc<0) err("fork new process"); 
  38.     pid = rc;
  39.        
  40.     if (pid == 0) {
  41.         rc = write_on_file(fd);
  42.         exit(rc);
  43.     } else {
  44.         read_last_message_from_file(fd);
  45.         exit(0);
  46.     }
  47. }
  48.  
  49. /**
  50. * Chiude l'esecuzione del processo, mostra un messaggio d'errore sullo stream d'errore
  51. *
  52. * @param message: messaggio d'errore da mostrare sullo stream d'errore
  53. */
  54. void err(char *message){
  55.     fprintf(stderr,"Error: %s\n",message);
  56.     exit(-1);
  57. }
  58.  
  59.  
  60. /**
  61. * Scrive un messaggio su un file e lo chiude.
  62. *
  63. * @param fd: file descrittore del file su cui scrivere
  64. * @return len_message: lunghezza del messaggio scritto su file
  65. */
  66. int write_on_file(int fd){
  67.     int rc;
  68.     size_t len_message;
  69.     char *message;
  70.    
  71.     printf("Insert a message: ");
  72.     scanf("%m[^\n]",&message);
  73.    
  74.     rc = strlen(message);
  75.     if (rc<0) err("strlen of message");
  76.     len_message = rc;
  77.    
  78.     rc = write(fd, message, len_message);
  79.     if (rc<0) err("write on file");
  80.    
  81.     rc = close(fd);
  82.     if (rc<0) err("close file");
  83.    
  84.     return len_message;
  85. }
  86.  
  87. /**
  88. * Legge l'ultimo messaggo scritto su un file e lo chiude.
  89. * @param fd: File descrittore del file da cui leggere l'ultimo messaggio
  90. */
  91. void read_last_message_from_file(int fd){
  92.     int rc, status;
  93.     size_t len_message;
  94.     char *message;
  95.    
  96.     rc = wait(&status);
  97.     if (rc<0) err("wait on father process");
  98.    
  99.     rc = WEXITSTATUS(status);
  100.     if (rc<0) err("wexitstatus from child process");
  101.     len_message = rc;
  102.    
  103.     rc = lseek(fd, -len_message, SEEK_CUR);
  104.     if (rc<0) err("lseek on file");
  105.    
  106.     message = malloc(len_message*sizeof(char));
  107.     if (message==NULL) err("malloc of string variable");
  108.    
  109.     rc = read(fd,message,len_message);
  110.     if (rc<0) err("read from file");
  111.     message[rc] = '\0';
  112.    
  113.     printf("Message: %s\n",message);
  114.     if (rc<0) err("printf of message");
  115.    
  116.     free(message);
  117.    
  118.     rc = close(fd);
  119.     if (rc<0) err("close file");
  120. }
RAW Paste Data