Отключвам и след това затварям. Един процес добавя записи ABCDEFGHIJ. Друг процес чете същия файл и пише ZZZZ. Нормалният файл трябва да бъде ZZZZ ABCDEFGHIJ
Но само веднъж видях следното: ZZZZEFGHIJ Значи записът ABCDEFGHIJ е повреден с ZZZZ.
Изглежда заключването ми не работи. Но го тествах. Един процес наистина чака друг. Може ли друг процес да пише във файла между отваряне и заключване? Или между отключване и затваряне?
Кодът е по-долу
int MyOpenWrite(char *name,int flags) {
int fd
fd = open(name,flags,S_IREAD|S_IWRITE|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
LockFile(fd);
return fd;
}
int WriteFile(char *name, char *data) {
...
fd = MyOpenWrite(fullName,O_CREAT|O_WRONLY|O_TRUNC);
write(fd,data,strlen(data));
UnLockFile(fd);
close(fd);
}
int ReadFile(char *name, char *data, int maxLength) {
fd = open(name,O_RDONLY);
LockFile(fd);
...
UnLockFile(fd);
close(fd);
}
int AppendFile(char *name, char *data) {
fd = MyOpenWrite(fullName,O_WRONLY|O_APPEND);
...
len=write(fd,data,strlen(data));
UnLockFile(fd);
close(fd);
}
int LockFile(int fd) {
struct flock lock;
lock.l_type = F_WRLCK;
lock.l_start = 0;
lock.l_whence = SEEK_SET;
lock.l_len = 0;
return fcntl(fd,F_SETLKW,&lock);
}
int UnLockFile(int fd) {
struct flock lock;
lock.l_type = F_UNLCK;
lock.l_start = 0;
lock.l_whence = SEEK_SET;
lock.l_len = 0;
return fcntl(fd,F_SETLKW,&lock);
}
Опитах да затворя (fd) UnLock (fd). Изглежда, че работи. Но така или иначе има забавяне между отваряне и заключване. Благодаря.
fflush
-ирането на файл всъщност записва файла. - person Basile Starynkevitch   schedule 19.03.2013fflush
изчиства stdio буферите. Това не гарантира, че битовете са физически записани на диска от ядрото. Имате нужда отfsync
за това. - person rra   schedule 19.03.2013Един от тези въпроси има директен отговор; за съжаление другият не го прави.
Ще започна с лесното – фактът, че
принадлежат към същия DOM елемент. Прав сте, че Ractive актуализира съществуващите елементи, вместо да ги премахва и създава нови - това е основна част от неговия дизайн. В този случай това е нежелано поведение, но можете да го заобиколите така:
Другият проблем - че
merge()
не се слива, а вместо това се държи така, сякаш правитеractive.set('messages.stream_id1.stream', new_message_stream)
- е по-труден. Проблемът е, че докато вие и аз знаем, че{{#messages[ current_stream_id ]}}
се равнява наmessages.stream_id1
, когатоcurrent_stream_id === 'stream_id1
, Ractive не знае.Това, което знае, е, че имаме израз, чиято стойност се определя от
messages
иcurrent_stream_id
. Когато стойността на която и да е от тези препратки се промени, изразът се преизчислява и ако тази стойност се промени, DOM се актуализира - но с помощта на стандартенset()
. Когато правитеractive.merge('messages.stream_id1.stream', ...)
, Ractive актуализира всички неща, които зависят от ключови пътеки, които са "нагоре" или "надолу по веригата" наmessages.stream_id1.stream
- което включваmessages
. Ето как изразът знае, че има нужда от преоценка.Възможно е бъдеща версия на Ractive да може да се справи с този случай по по-интелигентен начин. Може би може да отбележи масиви, които са обект на операции по сливане, и да провери резултатите от оценителя, за да види дали са идентични с един от тези масиви, и ако е така, използвайте
merge()
вместоset()
. Може би може да анализира функцията по някакъв начин, за да види дали секцията{{#messages[ current_stream_id ]}}
трябва да се регистрира като зависима отmessages.stream_id1
толкова дълго, колкотоcurrent_stream_id === 'stream_id1'
, а не вътрешно генерираната${messages-current_stream_id-}
пътека на ключ.Нищо от това обаче не ви помага междувременно. Единственият начин да използвате
merge()
в текущата си ситуация е да имате отделна препратка, която не използва израз, и малко магия с наблюдатели на шаблони:основен_шаблон:
render_message_stream:
код:
Настроих JSFiddle, демонстриращ това. Надявам се, че има смисъл, уведомете ме, ако не - и съжалявам, че не успях да отговоря на този въпрос много по-рано.
- person LtWorf   schedule 19.03.2013