#define _POSIX_C_SOURCE 200809L #include /* read, write, close, lseek */ #include /* openat */ #include /* exit, strtol */ #include /* strlen */ #include /* printf */ #include /* errno */ #include /* NONPOSIX: err, errx */ /* Vyrobí soubor ‹file› s dírou o velikosti ‹MiB› mebibajtů * + na konec napíše zadaný řetězec ‹endstring›. */ int main( int argc, char** argv ) { if ( argc < 4 ) errx( 1, "usage: %s file MiB endstring\n", argv[ 0 ] ); const char* filename = argv[ 1 ]; long mbytes = strtol( argv[ 2 ], 0, 0 ); const char* endstring = argv[ 3 ]; int fd = openat( AT_FDCWD, filename, O_CREAT | O_TRUNC | O_WRONLY, 0666 ); if ( fd == -1 ) err( 1, "openat %s", filename ); /* Skočí na zadanou pozici, čímž se po zápisu vytvoří „díra“ * – tj. úsek v souboru nezabírající na disku žádné místo a při * čtení vracející nulové bajty. */ lseek( fd, mbytes * 1024 * 1024, SEEK_SET ); if ( write( fd, endstring, strlen( endstring ) ) == -1 ) err( 1, "write" ); if ( close( fd ) ) warn( "close %s", filename ); return 0; }