Prova pratica 2017.02.17

From Sistemi Operativi
Revision as of 13:58, 26 May 2017 by FedericoB (talk | contribs) (Creata pagina con soluzione es 1)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

[link al testo]

Esercizio 1

Scrivere un programma ager in grado di invecchiare file.
Il programma deve poter prendere una lista di file come parametri o nessun parametro, nel qual caso invecchierà
tutti I file della directory corrente. “invecchiare” significa predatare il tempo di ultimo accesso e di modifica di 10
giorni.
Esempio:
$ ls -l file
-rw-r--r-- 1 renzo renzo 0 Feb 17 09:07 file
$ ./ager file
$ ls -l file
-rw-r--r-- 1 renzo renzo 0 Feb 7 09:07 file

Soluzione di FedericoB

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/stat.h>
#include <utime.h>

int main(int argc, char* argv[]) {
    if (argc>1) {
        int i=0;
        for (i=1;i<argc;i++) {
            struct stat structstat;
            if (stat(argv[i],&structstat)==0) {
                //read last access time
                time_t atim = structstat.st_atim.tv_sec;
                //read last modification time
                time_t mtim = structstat.st_mtim.tv_sec;
                atim -= 10 * 24 * 60 * 60;
                mtim -= 10 * 24 * 60 * 60;
                //create structure for utime
                struct utimbuf structutimbuf = {atim, mtim};
                //call utime for setting the new date
                if (utime(argv[i], &structutimbuf)!=0) {
                    //if utime failed print errno
                    perror(NULL);
                }
            } else {
                //if stat failed print errno
                perror(NULL);
            }
        }
    }
    return 0;
}