Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /******************************************************************************
- Scrivere un programma che esegue i seguenti passi rispettando l’ordine
- 1)apre un file F in R/W e quindi mantiene il suo descritore
- 2)fork-a un nuovo processo che ottiene un mesaggio dall’utente da tastiera e lo scrive sul file F
- 3)legge dal file F il messaggio che ha scritto il processo figlio e lo stampa sul terminale
- ******************************************************************************/
- #include <stdio.h>
- #include <stdlib.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <string.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- void err(char *message);
- int write_on_file(int fd);
- void read_last_message_from_file(int fd);
- int main(int argc, char* argv[]){
- int rc, fd;
- pid_t pid;
- char filename[25];
- char *message;
- printf("Insert name of file: ");
- fgets(filename,100,stdin);
- int i;
- for(i=0;filename[i]!='\n';i++);
- filename[i]='\0';
- rc = open(filename, O_RDWR | O_APPEND | O_CREAT, 0666);
- if (rc<0) err("open file");
- fd = rc;
- rc = fork();
- if (rc<0) err("fork new process");
- pid = rc;
- if (pid == 0) {
- rc = write_on_file(fd);
- exit(rc);
- } else {
- read_last_message_from_file(fd);
- exit(0);
- }
- }
- /**
- * Chiude l'esecuzione del processo, mostra un messaggio d'errore sullo stream d'errore
- *
- * @param message: messaggio d'errore da mostrare sullo stream d'errore
- */
- void err(char *message){
- fprintf(stderr,"Error: %s\n",message);
- exit(-1);
- }
- /**
- * Scrive un messaggio su un file e lo chiude.
- *
- * @param fd: file descrittore del file su cui scrivere
- * @return len_message: lunghezza del messaggio scritto su file
- */
- int write_on_file(int fd){
- int rc;
- size_t len_message;
- char *message;
- printf("Insert a message: ");
- scanf("%m[^\n]",&message);
- rc = strlen(message);
- if (rc<0) err("strlen of message");
- len_message = rc;
- rc = write(fd, message, len_message);
- if (rc<0) err("write on file");
- rc = close(fd);
- if (rc<0) err("close file");
- return len_message;
- }
- /**
- * Legge l'ultimo messaggo scritto su un file e lo chiude.
- * @param fd: File descrittore del file da cui leggere l'ultimo messaggio
- */
- void read_last_message_from_file(int fd){
- int rc, status;
- size_t len_message;
- char *message;
- rc = wait(&status);
- if (rc<0) err("wait on father process");
- rc = WEXITSTATUS(status);
- if (rc<0) err("wexitstatus from child process");
- len_message = rc;
- rc = lseek(fd, -len_message, SEEK_CUR);
- if (rc<0) err("lseek on file");
- message = malloc(len_message*sizeof(char));
- if (message==NULL) err("malloc of string variable");
- rc = read(fd,message,len_message);
- if (rc<0) err("read from file");
- message[rc] = '\0';
- printf("Message: %s\n",message);
- if (rc<0) err("printf of message");
- free(message);
- rc = close(fd);
- if (rc<0) err("close file");
- }
Add Comment
Please, Sign In to add comment