История изменений
Исправление 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] , если бы точно знать что и без этого всё должно нормально работать..