diff --git a/SCR3.1/TP2/, b/SCR3.1/TP2/, new file mode 100644 index 0000000..e409cac --- /dev/null +++ b/SCR3.1/TP2/, @@ -0,0 +1,158 @@ +DD(1) User Commands DD(1) + +NAME + dd - convert and copy a file + +SYNOPSIS + dd [OPERAND]... + dd OPTION + +DESCRIPTION + Copy a file, converting and formatting according to the operands. + + bs=BYTES + read and write up to BYTES bytes at a time (default: 512); over‐ + rides ibs and obs + + cbs=BYTES + convert BYTES bytes at a time + + conv=CONVS + convert the file as per the comma separated symbol list + + count=N + copy only N input blocks + + ibs=BYTES + read up to BYTES bytes at a time (default: 512) + + if=FILE + read from FILE instead of stdin + + iflag=FLAGS + read as per the comma separated symbol list + + obs=BYTES + write BYTES bytes at a time (default: 512) + + of=FILE + write to FILE instead of stdout + + oflag=FLAGS + write as per the comma separated symbol list + + seek=N (or oseek=N) skip N obs-sized output blocks + + skip=N (or iseek=N) skip N ibs-sized input blocks + + status=LEVEL + The LEVEL of information to print to stderr; ’none’ suppresses + everything but error messages, ’noxfer’ suppresses the final + transfer statistics, ’progress’ shows periodic transfer statis‐ + tics + + N and BYTES may be followed by the following multiplicative suffixes: + c=1, w=2, b=512, kB=1000, K=1024, MB=1000*1000, M=1024*1024, xM=M, + GB=1000*1000*1000, G=1024*1024*1024, and so on for T, P, E, Z, Y, R, Q. + Binary prefixes can be used, too: KiB=K, MiB=M, and so on. If N ends + in ’B’, it counts bytes not blocks. + + Each CONV symbol may be: + + ascii from EBCDIC to ASCII + + ebcdic from ASCII to EBCDIC + + ibm from ASCII to alternate EBCDIC + + block pad newline-terminated records with spaces to cbs-size + + unblock + replace trailing spaces in cbs-size records with newline + + lcase change upper case to lower case + + ucase change lower case to upper case + + sparse try to seek rather than write all-NUL output blocks + + swab swap every pair of input bytes + + sync pad every input block with NULs to ibs-size; when used with + block or unblock, pad with spaces rather than NULs + + excl fail if the output file already exists + + nocreat + do not create the output file + + notrunc + do not truncate the output file + + noerror + continue after read errors + + fdatasync + physically write output file data before finishing + + fsync likewise, but also write metadata + + Each FLAG symbol may be: + + append append mode (makes sense only for output; conv=notrunc sug‐ + gested) + + direct use direct I/O for data + + directory + fail unless a directory + + dsync use synchronized I/O for data + + sync likewise, but also for metadata + + fullblock + accumulate full blocks of input (iflag only) + + nonblock + use non-blocking I/O + + noatime + do not update access time + + nocache + Request to drop cache. See also oflag=sync + + noctty do not assign controlling terminal from file + + nofollow + do not follow symlinks + + Sending a USR1 signal to a running ’dd’ process makes it print I/O sta‐ + tistics to standard error and then resume copying. + + Options are: + + --help display this help and exit + + --version + output version information and exit + +AUTHOR + Written by Paul Rubin, David MacKenzie, and Stuart Kemp. + +REPORTING BUGS + GNU coreutils online help: + Report any translation bugs to + +COPYRIGHT + Copyright © 2023 Free Software Foundation, Inc. License GPLv3+: GNU + GPL version 3 or later . + This is free software: you are free to change and redistribute it. + There is NO WARRANTY, to the extent permitted by law. + +SEE ALSO + Full documentation + or available locally via: info '(coreutils) dd invocation' + +GNU coreutils 9.3 April 2023 DD(1) diff --git a/SCR3.1/TP2/coherence-test.txt b/SCR3.1/TP2/coherence-test.txt new file mode 100644 index 0000000..f23912c --- /dev/null +++ b/SCR3.1/TP2/coherence-test.txt @@ -0,0 +1 @@ +L'asr, c'est bien!! diff --git a/SCR3.1/TP2/coherence.c b/SCR3.1/TP2/coherence.c new file mode 100644 index 0000000..f9023e5 --- /dev/null +++ b/SCR3.1/TP2/coherence.c @@ -0,0 +1,96 @@ +#include +#include +#include +#include +#include + +#define TESTFILE "coherence-test.txt" + +void write_asr_c_pas_bien() +{ + FILE* f = fopen(TESTFILE, "w"); + fprintf(f, "L'asr, c'est pas bien!\n"); + fclose(f); +} + +void write_asr_c_bien() +{ + FILE* f = fopen(TESTFILE, "w"); + fprintf(f, "L'asr, c'est bien!!\n"); + fclose(f); +} + + +void read_using_syscalls() +{ + write_asr_c_pas_bien(); + + // open file descriptor + int fd = open(TESTFILE, O_RDONLY); + + // read first 12 bytes + char buf[BUFSIZ]; + ssize_t nr1 = read(fd, buf, 12); + assert(nr1 >= 0); + + write_asr_c_bien(); + + // read rest of file, print to stdout + ssize_t nr2 = read(fd, buf + nr1, BUFSIZ - nr1); + close(fd); + fwrite(buf, 1, nr1 + nr2, stdout); +} + + +void read_using_stdio() +{ + write_asr_c_pas_bien(); + + // open stdio file + FILE* f = fopen(TESTFILE, "r"); + + // read first 12 bytes + char buf[BUFSIZ]; + size_t nr1 = fread(buf, 1, 12, f); + + write_asr_c_bien(); + + // read rest of file, print to stdout + size_t nr2 = fread(buf + nr1, 1, BUFSIZ - nr1, f); + fclose(f); + fwrite(buf, 1, nr1 + nr2, stdout); +} + + +static void usage() +{ + fprintf(stderr, "Usage: ./coherence -l (linux syscalls) or ./coherence -s (stdio)\n"); + exit(1); +} + +int main(int argc, char** argv) +{ + int which = 0; + + int opt; + while ((opt = getopt(argc, argv, "ls")) != -1) { + switch (opt) { + case 's': + which = 's'; + break; + case 'l': + which = 'l'; + break; + default: + usage(); + } + } + + if (which == 's') { + read_using_stdio(); + } else if (which == 'l') { + read_using_syscalls(); + } else { + usage(); + } +} diff --git a/SCR3.1/TP2/copy b/SCR3.1/TP2/copy new file mode 100755 index 0000000..7ab7bc9 Binary files /dev/null and b/SCR3.1/TP2/copy differ diff --git a/SCR3.1/TP2/copy.c b/SCR3.1/TP2/copy.c new file mode 100644 index 0000000..b45f423 --- /dev/null +++ b/SCR3.1/TP2/copy.c @@ -0,0 +1,35 @@ +#include +#include +#include + +#define BLOCK_SIZE 1 + + +int main(int argc, char *argv[]) +{ + int fin, + fout; + char buf[BLOCK_SIZE]; + + assert( argc == 3 ); + + fin = open(argv[1],O_RDONLY); + assert( fin >= 0 ); + + fout = open(argv[2],O_CREAT|O_WRONLY|O_TRUNC,0600); + assert( fout >= 0 ); + + while(1){ + ssize_t nb_read; + nb_read = read(fin,buf,BLOCK_SIZE); + if (nb_read <= 0) + break; + write(fout,buf,nb_read); + } + + close(fin); + close(fout); + + return 0; +} + diff --git a/SCR3.1/TP2/copy_std b/SCR3.1/TP2/copy_std new file mode 100755 index 0000000..f62576c Binary files /dev/null and b/SCR3.1/TP2/copy_std differ diff --git a/SCR3.1/TP2/eraser.c b/SCR3.1/TP2/eraser.c new file mode 100644 index 0000000..ca72706 --- /dev/null +++ b/SCR3.1/TP2/eraser.c @@ -0,0 +1,32 @@ +#include +#include +#include +#include +#include +#include + +int main(int argc, char **argv){ + int fd, read_bytes, wrote_bytes; + if (argc != 2){ + printf("Usage : %s ", argv[0]); + exit(EXIT_FAILURE); + } + struct stat sf; + if (stat(argv[1], &sb) == -1){ + perror("stat"); + exit(EXIT_FAILURE); + } + if (sb.st_nlink >= (nlink_t) 1) { + unlink(argv[0]); + exit(EXIT_FAILURE); + } + else { + fd = open(argv[1], O_SYNC|O_RDONLY); + if (fd == -1){ + perror("fd"); + exit(EXIT_SUCCESS); + } + + return EXIT_SUCCESS; +} + diff --git a/SCR3.1/TP2/fadvise.c b/SCR3.1/TP2/fadvise.c new file mode 100644 index 0000000..8dbc52e --- /dev/null +++ b/SCR3.1/TP2/fadvise.c @@ -0,0 +1,155 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include +#define LINUX_FTOOLS_VERSION "1.0.0" +/** + +SYNTAX: filename mode [offset] [,length] +Where mode can be: + + POSIX_FADV_NORMAL No further special treatment. + POSIX_FADV_RANDOM Expect random page references. + POSIX_FADV_SEQUENTIAL Expect sequential page references. + POSIX_FADV_WILLNEED Will need these pages. + POSIX_FADV_DONTNEED Don't need these pages. + POSIX_FADV_NOREUSE Data will be accessed once. + +Allows an application to to tell the kernel how it expects to use a file handle, +so that the kernel can choose appropriate read-ahead and caching techniques for +access to the corresponding file. This is similar to the POSIX version of the +madvise system call, but for file access instead of memory access. The +sys_fadvise64() function is obsolete and corresponds to a broken glibc API, +sys_fadvise64_64() is the fixed version. The following are the values for the +advice parameter: + +FADV_NORMAL + +No special treatment. + +FADV_RANDOM + +Expect page references in random order. + +FADV_SEQUENTIAL + +Expect page references in sequential order. + +FADV_WILLNEED + +Expect access in the near future. + +FADV_DONTNEED + +Do not expect access in the near future. Subsequent access of pages in this +range will succeed, but will result either in reloading of the memory contents +from the underlying mapped file or zero-fill-in-demand pages for mappings +without an underlying file. + +FADV_NOREUSE + +Access data only once. + +*/ +int main(int argc, char *argv[]) { + + if ( argc < 3 ) { + fprintf( stderr, "%s version %s\n", argv[0], LINUX_FTOOLS_VERSION ); + printf( "SYNTAX: fadvise filename mode [offset] [,length]\n" ); + + printf( "Where mode can be:\n\n" ); + + printf( " POSIX_FADV_NORMAL No further special treatment. \n" ); + printf( " POSIX_FADV_RANDOM Expect random page references. \n" ); + printf( " POSIX_FADV_SEQUENTIAL Expect sequential page references. \n" ); + printf( " POSIX_FADV_WILLNEED Will need these pages. \n" ); + printf( " POSIX_FADV_DONTNEED Don't need these pages. \n" ); + printf( " POSIX_FADV_NOREUSE Data will be accessed once. \n" ); + + exit( 1 ); + } + + char* path = argv[1]; + char* param_mode = argv[2]; + + printf( "Going to fadvise %s\n", path ); + + int flags = O_RDWR; + int fd = open( path, flags ); + + if ( fd == -1 ) { + perror( NULL ); + return 1; + } + + struct stat fd_stat ; + + if ( fstat( fd, &fd_stat ) < 0 ) { + perror( "Could not stat file: " ); + return 1; + } + + loff_t offset = 0; + loff_t length = fd_stat.st_size; + + if ( argc >= 4 ) { + offset = strtol( argv[3], NULL, 10 ); + } + + if ( argc >= 5 ) { + length = strtol( argv[4], NULL, 10 ); + } + + printf( "offset: %ld\n", offset ); + printf( "length: %ld\n", length ); + + int mode = -1; + + if ( strcmp( param_mode , "POSIX_FADV_NORMAL" ) == 0 ) { + mode = POSIX_FADV_NORMAL; + } else if ( strcmp( param_mode , "POSIX_FADV_RANDOM" ) == 0 ) { + mode = POSIX_FADV_RANDOM; + } else if ( strcmp( param_mode , "POSIX_FADV_SEQUENTIAL" ) == 0 ) { + mode = POSIX_FADV_SEQUENTIAL; + } else if ( strcmp( param_mode , "POSIX_FADV_WILLNEED" ) == 0 ) { + mode = POSIX_FADV_DONTNEED; + } else if ( strcmp( param_mode , "POSIX_FADV_DONTNEED" ) == 0 ) { + mode = POSIX_FADV_DONTNEED; + } else if ( strcmp( param_mode , "POSIX_FADV_NOREUSE" ) == 0 ) { + mode = POSIX_FADV_NOREUSE; + } else { + printf( "Invalid mode %s\n", param_mode ); + exit( 1 ); + } + + printf( "mode: %s\n", param_mode ); + + long result = syscall( SYS_fadvise64, fd, offset, length , mode ); + + if ( result != 0 ) { + + if ( result != -1 ) { + errno=result; + perror( "Unable to fadvise" ); + } else { + printf( "Unable to fadvise: %ld\n" , result ); + } + + return 1; + } + + printf( "WIN\n" ); + + close( fd ); + return 0; + +} diff --git a/SCR3.1/TP2/my_cp_map.c b/SCR3.1/TP2/my_cp_map.c new file mode 100644 index 0000000..c425b68 --- /dev/null +++ b/SCR3.1/TP2/my_cp_map.c @@ -0,0 +1,70 @@ +#include +#include +#include +#include +#include +#include +#include +#include + + +#define BUFSIZE 1024 + + +static inline double tstamp(void) +{ + struct timespec tv; + clock_gettime(CLOCK_REALTIME, &tv); + return tv.tv_sec + tv.tv_nsec * 1.0e-9; +} + +int main(int argc, char *argv[]) +{ + //char buf[BUFSIZE]; + char * bufin = NULL, + * bufout = NULL; + + + int fin, + fout; + + double start, + end; + + size_t filesize = 0; + + assert(argc == 3); + + start = tstamp(); + + fin = open(argv[1],O_RDONLY); + assert(fin >=0); + + fout = open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0600); + assert(fout >=0); + + filesize = lseek(fin,0,SEEK_END); + ftruncate (fout,filesize); + + bufin = mmap(NULL,filesize,PROT_READ,MAP_PRIVATE,fin,0); + assert(bufin != (void*)-1); + + bufout = mmap(NULL,filesize,PROT_WRITE,MAP_SHARED,fout,0); + + assert(bufout != (void*)-1); + + + memcpy(bufout,bufin,filesize); + + //munmap(bufin,filesize); + //munmap(bufout,filesize); + + //ssize_t nb_read = read(fin,buf,sizeof(buf)); + close(fin); + close(fout); + + end = tstamp(); + + printf("time = %.3lf\n",end - start); + return 0; +} diff --git a/SCR3.1/TP2/stdcopy.c b/SCR3.1/TP2/stdcopy.c new file mode 100644 index 0000000..2017040 --- /dev/null +++ b/SCR3.1/TP2/stdcopy.c @@ -0,0 +1,36 @@ +#include +#include +#include +#include +#include + +#define BLOCK_SIZE 1 + + +int main(int argc, char *argv[]) +{ + FILE *fin, *fout; + char buf[BLOCK_SIZE]; + + assert( argc == 3 ); + + fin = fopen(argv[1],"r"); + assert( fin >= 0 ); + + fout = fopen(argv[2],"w"); + assert( fout >= 0 ); + + while(1){ + ssize_t nb_read; + nb_read = fread(buf,sizeof(char),BLOCK_SIZE,fin); + if (nb_read <= 0) + break; + fwrite(buf,sizeof(char),BLOCK_SIZE,fout); + } + + fclose(fin); + fclose(fout); + + return 0; +} + diff --git a/SCR3.1/TP2/toto b/SCR3.1/TP2/toto new file mode 100644 index 0000000..cdedea5 Binary files /dev/null and b/SCR3.1/TP2/toto differ diff --git a/SCR3.1/TP2/toto.dut b/SCR3.1/TP2/toto.dut new file mode 100644 index 0000000..cdedea5 Binary files /dev/null and b/SCR3.1/TP2/toto.dut differ diff --git a/SCR3.1/TP2/toto2 b/SCR3.1/TP2/toto2 new file mode 100644 index 0000000..cdedea5 Binary files /dev/null and b/SCR3.1/TP2/toto2 differ diff --git a/SCR3.1/TP2/totos b/SCR3.1/TP2/totos new file mode 100644 index 0000000..cdedea5 Binary files /dev/null and b/SCR3.1/TP2/totos differ diff --git a/SCR3.1/TP2/tp2_reponses.txt b/SCR3.1/TP2/tp2_reponses.txt new file mode 100644 index 0000000..01cf8bc --- /dev/null +++ b/SCR3.1/TP2/tp2_reponses.txt @@ -0,0 +1,5 @@ +Exercice 1) +Lors de la copie, fread créé un buffer de 8192 octets, ce qui accèlere la vitesse d'échange + +Exercice 2) +