LINUX.ORG.RU

История изменений

Исправление user_id_68054, (текущая версия) :

вы сможете имитировать отсутствие O_EXCL (т.е. обычный creat()) только чередованием open с EXCL|CREAT и open без EXCL|CREAT, в конце концов дождавшись успеха от одного из них. А это как раз верный способ словить проблем на пустом месте

да, правда в том что, если бы мне точно знать, что O_CREAT|O_TRUNC (без O_EXCL) — работает именно атомарно-и-консистентно для множества конкурентных процессов, то это позволило бы избежать различные костыли.

потому что ведь костыль можно придумать и другой, не обязательно именно O_EXCL .

костыль может быть например такой (без O_EXCL):

1. сначало открывать каталог (например «/run/») как файловый-дескриптор.

2. затем делать эксклюзивную блокировку этого каталога (по его файловому-дескриптору).

3. затем f = open("/run/my_super_file" , O_CREAT|O_TRUNC );

4. затем (перед началом работы с f) освобождать эксклюзивную блокировку каталога.

5. непосредственная работа с файловым дескриптором f...

6. ...

вот только можно было бы избежать использования [1],[2],[4] , если бы точно знать что и без этого всё должно нормально работать..

Исправление user_id_68054, :

вы сможете имитировать отсутствие O_EXCL (т.е. обычный creat()) только чередованием open с EXCL|CREAT и open без EXCL|CREAT, в конце концов дождавшись успеха от одного из них. А это как раз верный способ словить проблем на пустом месте

да, правда в том что, если бы мне точно знать, что O_CREAT|O_TRUNC (без O_EXCL) — работает именно атомарно-и-консистентно для множества конкурентных процессов, то это позволило бы избежать различные костыли.

потому что ведь костыль можно придумать и другой, не обязательно именно O_EXCL .

костыль может быть например такой (без O_EXCL):

1. сначало открывать каталог (например «/run/») как файловый-дескриптор.

2. затем делать эксклюзивную блокировку этого каталога (по его файловому-дескриптору).

3. затем f = open("/run/my_super_file" , O_CREAT|O_TRUNC );

4. затем (переда началом работы с f) освобождать эксклюзивную блокировку каталога.

5. непосредственная работа с файловым дескриптором f...

6. ...

вот только можно было бы избежать использования [1],[2],[4] , если бы точно знать что и без этого всё должно нормально работать..

Исправление user_id_68054, :

вы сможете имитировать отсутствие O_EXCL (т.е. обычный creat()) только чередованием open с EXCL|CREAT и open без EXCL|CREAT, в конце концов дождавшись успеха от одного из них. А это как раз верный способ словить проблем на пустом месте

да, правда в том что, если бы мне точно знать, что O_CREAT|O_TRUNC (без O_EXCL) — работает именно атомарно-и-консистентно для множества конкурентных процессов, то это позволило бы избежать различные костыли.

потому что ведь костыль можно придумать и другой, не обязательно именно O_EXCL .

костыль может быть например такой (без O_EXCL):

1. сначало открывать каталог (например «/run/») как файловый-дескриптор.

2. затем делать эксклюзивную блокировку этого каталога (по его файловому-дескриптору).

3. затем f = open("/run/my_super_file" , O_CREAT|O_TRUNC )

4. затем (переда началом работы с f) освобождать эксклюзивную блокировку каталога.

5. непосредственная работа с файловым дескриптором f...

6. ...

вот только можно было бы избежать использования [1],[2],[4] , если бы точно знать что и без этого всё должно нормально работать..

Исправление user_id_68054, :

вы сможете имитировать отсутствие O_EXCL (т.е. обычный creat()) только чередованием open с EXCL|CREAT и open без EXCL|CREAT, в конце концов дождавшись успеха от одного из них. А это как раз верный способ словить проблем на пустом месте

да, правда в том что, если бы мне точно знать, что O_CREAT|O_TRUNC (без O_EXCL) — работает именно атомарно-и-консистентно для множества конкурентных процессов, то это позволило бы избежать различные костыли.

потому что ведь костыль можно придумать и другой, не обязательно именно O_EXCL .

костыль может быть например такой (без O_EXCL):

1. сначало открывать каталог (например «/run/») как файловый-дескриптор.

2. затем делать эксклюзивную блокировку этого каталога (по его файловому-дескриптору).

3. затем f = open("/run/my_suerp_file" , O_CREAT|O_TRUNC )

4. затем (переда началом работы с f) освобождать эксклюзивную блокировку каталога.

5. непосредственная работа с файловым дескриптором f...

6. ...

вот только можно было бы избежать использования [1],[2],[4] , если бы точно знать что и без этого всё должно нормально работать..

Исходная версия user_id_68054, :

вы сможете имитировать отсутствие O_EXCL (т.е. обычный creat()) только чередованием open с EXCL|CREAT и open без EXCL|CREAT, в конце концов дождавшись успеха от одного из них. А это как раз верный способ словить проблем на пустом месте

да, правда в том что, если бы мне точно знать, что O_CREAT|O_TRUNC (без O_EXCL) — работает именно атомарно-и-консистентно для множества конкурентных процессов, то это позволило бы избежать различные костыли.

потому что ведь костыль можно придумать и другой, не обязательно именно O_EXCL .

потому как, костыль может быть например и такой (без O_EXCL):

1. сначало открывать каталог (например «/run/») как файловый-дескриптор.

2. затем делать эксклюзивную блокировку этого каталога (по его файловому-дескриптору).

3. затем f = open("/run/my_suerp_file" , O_CREAT|O_TRUNC )

4. затем (переда началом работы с f) освобождать эксклюзивную блокировку каталога.

5. непосредственная работа с файловым дескриптором f...

6. ...

вот только можно было бы избежать использования [1],[2],[4] , если бы точно знать что и без этого всё должно нормально работать..