Hirdetés

Új hozzászólás Aktív témák

  • Jester01
    veterán

    egy kis program forraskodjat neztem, ennel megakadtam:

    n = snprintf(buffer, sizeof(buffer),"...",... );
    /*
    * We write it with the final '\0' and then truncate it.
    * This way, even if somebody were to read it concurrently,
    * the data should always be valid as a string.
    */
    write(fd, buffer, n+1);
    ftruncate(fd, n);

    mit akar jelenteni ez a komment? es miert is jo ez igy?

    Valószínűleg ez fájl felülírás, tehát már lehet valami ott. Ha feltételezzük, hogy az olvasás a fájl végéig megy, akkor 0 byte hatására még ha van is utána szemét az C stringként már nem fog látszani.

    Pl. ha a fájlban most az van, hogy "makvirag" és azzal akarod felülírni, hogy "rozsa" akkor a 0 byte nélkül az lenne ott átmenetileg, hogy "rozsarag". Ha egy másik program épp ilyenkor olvasná ki akkor hibás adatot kapna. Ha viszont a lezáró nulla byte is bekerül, akkor azt fogja kapni, hogy "rozsa<0>ag". De mivel a C logika szerint a string csak a 0 byteig tart, ezért ez a helyes "rozsa" értékkel egyenértékű. Ezután persze az ftruncate le fogja vágni a fölösleges byteokat, szóval csak egy nagyon rövid ideig fordulhat elő.

Új hozzászólás Aktív témák