На SO пишут, в манах пишут — да везде полагается, что rename()
— атомарная операция.
Однако, пишу сохранение файла:
int Image_write_jpg(const Image *I, const char *name, int eq){
if(!I || !I->data) return 0;
uint8_t *outp = NULL;
if(eq)
outp = equalize(I, 1, GP->throwpart);
else
outp = linear(I, 1);
DBG("Try to write %s", name);
char *tmpnm = MALLOC(char, strlen(name) + 5);
sprintf(tmpnm, "%s-tmp", name);
// char *tmpnm = tmpnam_r(buf);
int r = stbi_write_jpg(tmpnm, I->width, I->height, 1, outp, 95);
if(r){
if(rename(tmpnm, name)){
WARN("rename()");
r = 0;
}
}
FREE(tmpnm);
FREE(outp);
return r;
}
feh -R 0.3 outpWcrosses.jpg
и что же вижу? То сообщения "feh WARNING: outpWcrosses.jpg - Does not look like an image (magic bytes missing)", то "feh WARNING: Couldn't reload image. Is it still there?". И на изображении периодически кусок отсутствует (залит серым).(закомментированная строчка — это то, что я вначале пытался сделать, с временным файлом в оперативе; однако, когда начала эта непонятная фигня с неатомарностью происходить, решил попробовать в пределах одной ФС, но не помогло)
Что это за Ë-моë?