Что произойдет, если кто-то перезапишет файл после того, как я открою его? - PullRequest
2 голосов
/ 12 января 2020

Когда я открываю файл в C, я получаю дескриптор файла, если я не прочитал его содержимое, а затем кто-то изменяет файл, я буду читать старый файл или новый файл? Допустим, в файле много строк, что происходит, когда при чтении файла кто-то редактирует начало, это каким-то образом повредит, как мой файл читает файл?

Как программы не повреждаются, пока файл читается? Является ли ОС, которая решает эту проблему? Если я все еще могу прочитать старые данные, где хранятся эти данные?

На странице руководства open есть некоторая информация о внутренностях open, но она мне не очень понятна.

Ответы [ 2 ]

5 голосов
/ 12 января 2020

Стандарт языка C не признает существование других процессов и не определяет взаимодействие между ними и программой (равно как и C ++). Поведение зависит от операционной системы и / или файловой системы.

Как правило, безопаснее предположить, что файловые операции не выполняются атомарно c и, следовательно, доступ к файлу при редактировании другого процесса будет пример состояния гонки. Некоторые системы могут предоставлять более строгие гарантии.

Общий подход к попытке избежать проблем - блокировка файлов. Стандартная библиотека C не имеет API для блокировки файлов, но, как правило, в многозадачных операционных системах.

2 голосов
/ 12 января 2020

Все это сильно зависит от ОС, а не от уровня C ++. Например, в Windows открытие файла с помощью CreateFile позволяет заблокировать файл для последующего доступа. Но не на уровне языка.

Вы должны принять решение в зависимости от конкретной c ОС, с которой вы работаете. Есть нет предположений; все зависит от документации, которая вам предоставляется.

Как правило, документация уровня C ++ не очень полезна при таких проблемах, потому что никогда не может быть полного стандарта для чего-то такого низкого уровня, как доступ к файлам (даже fs был добавлен только недавно в C ++), и нет никакого смысла создание «переносимого» кода на таком. Вы должны привыкнуть погружаться в документацию и библиотеки ОС, специфицированные c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...