Я не знаю, почему этот код не работает под NFS4, с NFS3 работает отлично. Идея состоит в том, чтобы избежать записи файла, пока процесс все еще читает его.
Хотелось бы отладить, но наш сисадмин не умеет. Что может быть причиной. При нашей установке NFS4 я всегда попадаю в это состояние
если ( стадо (fp, LOCK_EX) == -1)
printf("Ошибка: файл %s уже заблокирован\n", fileName);
вся программа такая:
#include <sys/file.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv){
если (argc<2){
printf("Использование:\n a.out имя_файла\n");
вернуть 1;
}
символ *имя_файла=argv[1];
интервал кадров;
/* заблокировать файл, я знаю, что процесс может записать
делает мою информацию бесполезной*/
fp = открыть (имя файла, O_RDONLY);
если ( стадо (fp, LOCK_EX) == -1) {
printf("Ошибка: файл %s уже заблокирован\n", fileName);
}
еще{
printf("Хорошо: файл %s заблокирован\n",fileName );
}
/* прочитать и проанализировать имя файла
другой процесс не должен иметь возможности записи или
изменить имя файла, пока я его читаю
*/
вернуть 0;
}
Редактировать:
Я хотел бы уточнить. Это фрагмент кода, который я использую. fileName должен быть действительным существующим файлом
Я читаю имя файла и делаю копию, редактируя несколько частей. Я знаю, пока я это делаю, внешний процесс может обновить имя файла. Я хотел бы использовать семафор, чтобы избежать изменений в этом файле, пока я не закончу с ним. Эта программа работала отлично, пока не перестала это делать. Единственная разница — это файловая система, в которой расположены имена файлов. Он был обновлен с NFS3 до NFS4. Даже ОС (SLE15.2) такая же, как и ядро 5.3.18, и использование strerror(errno) приводит к ошибке seg в NFS4. Единственная подсказка, когда я печатаю ("% d", ошибка) - это 9, что должно быть "неправильным дескриптором файла"
Спасибо за вашу помощь
Юлия