Tôi không biết tại sao mã này không hoạt động trong NFS4, sử dụng NFS3 hoạt động hoàn hảo. Ý tưởng là để tránh tệp được ghi trong khi một tiến trình vẫn đang đọc nó.
Tôi muốn gỡ lỗi, nhưng quản trị viên hệ thống của chúng tôi không thể. Đó có thể là lý do. Trong Cài đặt NFS4 của chúng tôi, tôi luôn gặp phải tình trạng này
nếu ( bầy(fp,LOCK_EX) == -1)
printf("Lỗi: tập tin %s đã bị khóa\n", tên tập tin);
toàn bộ chương trình là:
#include <sys/file.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv){
nếu (argc<2){
printf("Cac dung:\n a.out fileName\n");
trả lại 1;
}
char *fileName=argv[1];
intfp;
/* chặn tệp, tôi biết một tiến trình có thể ghi
khiến thông tin của tôi trở nên vô dụng*/
fp=open(fileName,O_RDONLY);
nếu ( bầy(fp,LOCK_EX) == -1){
printf("Lỗi: tập tin %s đã bị khóa\n", tên tập tin);
}
khác{
printf("OK: file %s bị khóa\n",tên file );
}
/* đọc và phân tích tên tệp
một quá trình khác sẽ không thể viết hoặc
sửa đổi tên tệp trong khi tôi đang đọc nó
*/
trả về 0;
}
Chỉnh sửa:
Tôi muốn bạn làm rõ. Đây là một đoạn mã tôi đang sử dụng. fileName được cho là một tệp hiện có hợp lệ
Tôi đang đọc tên tệp và tạo một bản sao, chỉnh sửa một số phần. Tôi biết, trong khi tôi đang làm việc này, một quy trình bên ngoài có thể cập nhật tên tệp. Tôi muốn sử dụng một semaphore để tránh sửa đổi tệp này cho đến khi tôi hoàn thành nó. Chương trình này đã hoạt động hoàn hảo cho đến khi ngừng hoạt động. Sự khác biệt duy nhất, là hệ thống tệp nơi đặt Tên tệp. Nó đã được cập nhật từ NFS3 thành NFS4. Ngay cả HĐH (SLE15.2) cũng giống với kernel 5.3.18 và việc sử dụng strerror(errno) sẽ tạo ra lỗi seg trên NFS4. Gợi ý duy nhất khi tôi thực hiện print("%d",error) là 9, đó phải là "bộ mô tả tệp sai"
Cảm ơn bạn đã giúp đỡ
Julia