Я не знаю, почему этот код не работает под 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, что должно быть "неправильным дескриптором файла"
Спасибо за вашу помощь
Юлия