BG Development


Страници: (2) 1 [2]   ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> един файл - много процеси
bvbfan
Публикувано на: 01-03-2018, 09:51
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2786
Регистриран на: 08.12.13



Няма нужда да удрям никво SO, там читаво инфо може да получиш 1:100. Аз съм се занимавал, не мога да кажа дали на С го писал или Python, но имаше такъв проблем, който не си спомням как реших, може наистина да е бил само O_APPEND.


--------------------
QUOTE (Bender @ 23-04-2015, 19:11)
Xamarin: ЛАПАЙ!
Ти: Добре...
PMEmail Poster
Top
Dr.Who
Публикувано на: 01-03-2018, 10:12
Quote Post



Име:
Група: Потребител
Ранг: Редовен член

Мнения: 327
Регистриран на: 25.05.14



QUOTE (Gamma Goblin @ 01-03-2018, 09:40)
QUOTE (Dr.Who @ 01-03-2018, 09:11)
QUOTE (bvbfan @ 01-03-2018, 07:13)
И аз мисля, че трябва да има някаква синхронизация, защото може да свършиш с
Some tSome text from pocess 2
ext from process1

Не може да стане.
Всеки запис се прави с single write, който е атомарна операция.

Не е баш така. Срамота е да ни си ударил един SO преди да говориш такива глупости https://stackoverflow.com/a/1154599/2588800

Ети и друго https://www.notthewizard.com/2014/06/17/are...-really-atomic/

и още едно http://www.gnu.org/software/libc/manual/ht...-Atomicity.html

Да разчиташ на такъв хак е меко казано неразумно

Аве, трол нескопосан. На тези линкове пише точно, това дето и аз казвам.
PMEmail Poster
Top
johnfound
Публикувано на: 01-03-2018, 11:05
Quote Post


Group Icon
Име:
Група: VIP
Ранг: Почетен член

Мнения: 6337
Регистриран на: 27.05.04



Това се прави така:

1. Преименува се стария файл в нещо друго. Това е възможно и за отворени и заключени файлове. Процесите, които са го отворили изобщо не забелязват преименуването и продължават да си пишат в него.

2. Сигнализират се процесите да "презаредят" файла. Те затварят файловия манипулатор и го отварят отново, при което се разкачат от стария файл и започват да пишат в новия. Когато всички се разкачат, стария файл вече не се използва и може да се копира, архивира и т.н.

Стандартния начин за сигнализиране е чрез изпращане на сигнал, но има и много други варианти - програмиста си решава кой от тях да използва.


--------------------
asm32 - Приложно програмиране на асемблер.
Tox: 2B446ADCEC7E180CD4C59391D81D4CAB3E99CA7AE767DB3AB45AF976F8A2050FF071DDB733F1
PMEmail PosterUsers Website
Top
Dr.Who
Публикувано на: 01-03-2018, 11:39
Quote Post



Име:
Група: Потребител
Ранг: Редовен член

Мнения: 327
Регистриран на: 25.05.14



QUOTE (johnfound @ 01-03-2018, 11:05)
Това се прави така:

1. Преименува се стария файл в нещо друго. Това е възможно и за отворени и заключени файлове. Процесите, които са го отворили изобщо не забелязват преименуването и продължават да си пишат в него.

2. Сигнализират се процесите да "презаредят" файла. Те затварят файловия манипулатор и го отварят отново, при което се разкачат от стария файл и започват да пишат в новия. Когато всички се разкачат, стария файл вече не се използва и може да се копира, архивира и т.н.

Стандартния начин за сигнализиране е чрез изпращане на сигнал, но има и много други варианти - програмиста си решава кой от тях да използва.

Това е едното стандартно решение.
Другото е copy-truncate.
Третото е : всичко се пренасочва към fifo aka named pipe и от другата страна на fifo-то един процес чете и пише по файловете.

Аз клоня към вариация на 1. - чрез inotify , където OS-a ще се грижи за списъка от процеси за сигнализиране и за изпращането на сигнала.

PMEmail Poster
Top
FidelDahan
Публикувано на: 01-03-2018, 12:01
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2337
Регистриран на: 12.06.08



QUOTE (Dr.Who @ 01-03-2018, 11:39)
Третото е : всичко се пренасочва към fifo  aka named pipe и от другата страна на fifo-то един процес чете и пише по файловете.

Ами това си е най-чистото решение един процес да приема и разпределя съдържанието по файлове както си иска. Тоест отделните процеси не се занимават със синхронизация и прочие, а това го прави тръбата и този daemon. А не може ли да използваш rsyslog?

Това мнение е било редактирано от FidelDahan на 01-03-2018, 12:02
PMEmail Poster
Top
dvader
Публикувано на: 01-03-2018, 12:06
Quote Post


Group Icon
Име:
Група: VIP
Ранг: Почетен член

Мнения: 4065
Регистриран на: 12.07.05



QUOTE (johnfound @ 01-03-2018, 11:05)
2. Сигнализират се процесите да "презаредят" файла.

В условието е казано "без добавяне на сигнали"...


--------------------
I find your lack of faith disturbing
PM
Top
roncho
Публикувано на: 01-03-2018, 22:56
Quote Post


Group Icon
Име:
Група: VIP
Ранг: Старо куче

Мнения: 622
Регистриран на: 15.06.04



Понеже използвам точно такъв казус в моята V-машина, ще споделя и аз:
Имам постоянно работещ процес (наричам го групов контекст), в който
останалите програми се записват, когато отварят възможен общ файл или друго действие изискващо синхронизация. Това го правя с таблици, текстове, карти и игрови сцени.
При промяна те обменят сигнали с този процес и така образите на различните екрани се синхронизират.
Това става с помощ на ниско ниво - заедно с операционната система, а не само чрез кода на програмните процеси. Ето част от табличния код:
CODE

(**************************************************)
procedure NotifyOtherTables(igrmsg:integer;ph:PB4TableHeader;pid,uid,tploffset:integer;tpl:PTxtUser);
var
amsg:s255;
topi,toui:integer;
s1:s255;
begin
if igrmsg in [1,2] then
 begin
  if tpl^.ufla=102 then
   igrmsg:=2;
  if igrmsg=1 then amsg:=gmsg_playerchange;
  if igrmsg=2 then amsg:=gmsg_playerfile;
  topi:=0;toui:=0;
  if tpl^.ufla=100 then
   begin
    topi:=tpl^.upid;
    toui:=tpl^.uwid;
   end;
  move(ph^.terminal_window_id,tpl^.uwid,2*V1IntegerSize);
  tpl^.upid:=pid;
  tpl^.ufla:=igrmsg;
  move(ph^.firstr,tpl^.firstr,2*V1IntegerSize);
  move(ph^.curr,tpl^.curr,6*V1IntegerSize);
  move(ph^.chars_in_line,tpl^.chars_in_line,2*V1IntegerSize);
  setlength(s1,sizeof(TTxtUser));
  move(tpl^,s1[1],ord(s1[0]));
  NotifyGroup(ctxtype_table,ctxname_table+' '+ph^.table_name,pid,uid,topi,toui,tploffset,amsg+s1);
 end;
end;



Общия достъп се очаква от мрежовата организация според интуицията на всеки юзер, но няма просто решение. Без синхронизиращи сигнали означава да се доверим на външна услуга (стига да има такава). Но в името на "импортозапрещението" е по-чисто да си организира човек сам.

Това мнение е било редактирано от roncho на 01-03-2018, 23:13


--------------------
PMUsers Website
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (2) 1 [2]  Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2018 | BG Development | All Rights Reserved
RSS 2.0