В среде и с реализацией C, где вы должны приспосабливаться к такому поведению, наилучшим подходом, вероятно, является реализация некоторой отказоустойчивости вокруг fopen()
s. Хотя безусловный sleep()
не является правильным ответом, короткие, условные задержки с помощью sleep()
или аналогичной функции действительно могут быть частью такой стратегии. Например, вы можете сделать что-то вроде этого:
#include <stdio.h>
#include <errno.h>
#define MAX_ATTEMPTS 3
FILE *tolerant_fopen(const char *path, const char *mode) {
FILE *result;
int attempts = 0;
while (!(result = fopen(path, mode))) {
if (errno != EACCES || attempts >= MAX_ATTEMPTS) {
break;
}
if (sleep(1) == 0) {
attempts += 1;
}
}
return result;
}
При попытке открыть файл немедленно, а в случае сбоя из-за разрешений на доступ он некоторое время ждет, а затем делает еще одну попытку. В целом, он может сделать три или более попыток открыть файл с интервалом в одну секунду или, возможно, чуть больше. (Обратите внимание, что sleep()
может быть прервано досрочно; в этом случае он возвращает количество секунд, оставшихся до сна.)
Конечно, вы можете реализовать другую стратегию для определения времени и продолжительности повторных попыток, если хотите, повторить больше ошибок, и т. Д. ..