nixp.ru v3.0

22 января 2017,
воскресенье,
11:05:07 MSK

Аутсорсинг Linux с компанией «Флант»
Fatal написал 15 ноября 2004 года в 10:53 (537 просмотров) Ведет себя как мужчина; открыл 123 темы в форуме, оставил 484 комментария на сайте.

/*********************************************

Подскажите, пожалуйста, что за нафиг?

Почему функция 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

*/

decvar

MS_ASYNC пробовал?

Fatal

Пробовал

Fatal

Если изменить строку

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() ничего не меняется, ничего не работает

Fatal

Надо сказать, я ошибся с перовеодом, синхронизация происходит не отображенного файла с файлом на жеским диском, а наоборот.

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.