/*********************************************
Подскажите, пожалуйста, что за нафиг?
Почему функция msync() не работает?
**********************************************/
#include
#include
#include
#include
#include
/*
Программа:
1) создает файл
2) записывает туда строку
3) отображает файл в памяти
4) переворачивает строку
5) и вроде бы должна записывать обратно в файл функцией msync, но ничего не выходит
*/
int main(void){
int fd;
char*data=«ABCDEF», *p;
int i,k,t,end;
size_t size;
/* открываем файл */
fd=open(«TEST»,O_RDWR|O_CREAT,0700);
if(-1==fd){perror(«open»);return 1;}
/* записываем данные, это функция не буферизирует данные*/
write(fd,data,strlen(data));
/* можно и без перемотки в начало */
lseek(fd,0,SEEK_SET);
/* подсчитываем количество символов в файле */
size=lseek(fd,0,SEEK_END);
/* lseek(fd,0,SEEK_SET); */
/* отображаем файл на диск */
p=mmap(NULL,size,PROT_READ|PROT_WRITE,0,fd,0);
if(MAP_FAILED==p){perror(«mmap»);return 1;}
/* выводим на печать содержимое отображенного файла */
for(i=0;i
/* переворичиваем содержимое отраженного файла (операция запятая производит действия слева направо) */
for(
i=0,k=size-1,end=size/2;
i
t=p, p=p[k], p[k]=t, ++i, k--
);
/* выводим на печать содержимое отображенного файла */
for(i=0;i
/*??????????????????????????????????*/
/* вроди бы эта функция должна записать содержимое отображенного файла на диска, во всяком случае так в man написано, да не тут-то было, вообще не понятно, что она делает */
msync(p,size,MS_SYNC);
if(-1==t){perror(«munmap»);return 1;}
for(i=0;i
/* освобождаем память */
t=munmap(p,size);
if(-1==t){perror(«munmap»);return 1;}
close(fd);
return 0;
}
/*
Вот что говорят об это man’ы
MSYNC(2) FreeBSD System Calls Manual MSYNC(2)
…
The msync() system call writes any modified pages back to the filesystem
and updates the file modification time. If len is 0, all modified pages
within the region containing addr will be flushed; if len is non-zero,
only those pages containing addr and len-1 succeeding locations will be
examined. The flags argument may be specified as follows:
MS_ASYNC Return immediately
MS_SYNC Perform synchronous writes
MS_INVALIDATE Invalidate all cached data
…
*/
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
MS_ASYNC пробовал?
Пробовал
Если изменить строку
p=mmap(NULL,size,PROT_READ|PROT_WRITE,0,fd,0)
на
p=mmap(NULL,size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0)
, то есть добавить MAP_SHARED, то даже если убрать строку msync(p,size,0), то на диск все запишится. Но мне бы нужно урезать отображенный файл и поэтому я хочу попробовать msync(), так как там можно указать размер, который нужно синхронизировать.
P.S.
какой бы я флаг не устанавливал в msync() ничего не меняется, ничего не работает
Надо сказать, я ошибся с перовеодом, синхронизация происходит не отображенного файла с файлом на жеским диском, а наоборот.