Điểm:1

bầy không thành công với NFSv4

lá cờ ph

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

Matthew Ife avatar
lá cờ jo
Dòng ```if ( bầy(fp,LOCK_EX) == -1){``` chỉ cho bạn biết nếu khóa độc quyền không thành công. Tại sao không. Thay đổi printf thành ```printf("Lỗi: tệp %s đã bị khóa: %s\n", tên tệp, strerror(errno));``` Bạn chỉ đang giả định rằng đó là một vấn đề cơ bản với việc khóa nhưng bạn có thể gặp lỗi cơ bản hơn (chẳng hạn như cố khóa một tệp không tồn tại).
lá cờ de
Bạn nên in lỗi (theo đề xuất của người khác) để xem tại sao yêu cầu khóa không thành công.
djdomi avatar
lá cờ za
Tôi tin rằng câu hỏi này sẽ phù hợp hơn trên StackOverflow thay vì trên trang web này.
Điểm:0
lá cờ jo

Đoạn mã 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);
}
khác{
    printf("OK: file %s bị khóa\n",tên file );
}

Thực sự chỉ có thể cho bạn biết rằng khóa không thành công hoặc thành công nhưng không biết tại sao. Bạn nên thay đổi nó để báo cáo sai lầm lý do không thành công vì nó có thể chỉ ra một vấn đề cơ bản hơn với việc khóa của bạn -- chẳng hạn như cố mở một tệp mà bạn không có quyền hoặc không tồn tại.

nếu ( bầy(fp,LOCK_EX) == -1){
    printf("Lỗi: tập tin %s đã bị khóa: %s\n", tên tập tin, strerror(errno));
}
khác{
    printf("OK: file %s bị khóa\n",tên file );
}

Bạn cũng có thể muốn bao gồm errno.h trong danh sách bao gồm cả để đảm bảo bạn tiếp cận đúng biến.

Điểm:0
lá cờ de

NFS v3 không có hỗ trợ khóa ở cấp độ giao thức. Chức năng này được cung cấp bởi một giao thức bổ sung (bên ngoài giao thức nfs) quản lý khóa. Mặt khác, NFS v4 có khóa như một phần của thông số kỹ thuật. Hơn nữa, có hai loại khóa. một là khóa phạm vi byte, thứ hai là truy cập chia sẻ. Mặc dù cái sau là thứ bạn đang tìm kiếm, API POSIX không hiển thị nó, do đó không có sẵn cho linux và unix.

Để khóa hoạt động với nfs v4 và v3, bạn cần sử dụng khóa phạm vi byte có sẵn như fcntl hoặc khóa chức năng.

Kiểm tra mã của bài kiểm tra khóa được sử dụng bởi các nhà phát triển nfs (bao gồm cả tôi) để xác thực hành vi của máy khách/máy chủ độc lập với phiên bản giao thức.

http://git.linux-nfs.org/?p=steved/cthon04.git;a=blob;f=lock/tlock.c;h=8c837a87976d17c58a25c9bd08d9f935e4521402;hb=HEAD#l835

Điểm:0
lá cờ kz

Mình vừa xem trang chủ của đàn, trong phần GHI CHÚ có phần quan trọng:

chi tiết NFS
   Trong các nhân Linux lên đến 2.6.11, floc() không khóa các tệp trên NFS (nghĩa là phạm vi khóa được giới hạn trong hệ thống cục bộ). Thay vào đó, người ta có thể sử dụng khóa phạm vi byte fcntl(2), điều này không
   hoạt động trên NFS, được cung cấp phiên bản Linux đủ mới và máy chủ hỗ trợ khóa.

   Kể từ Linux 2.6.12, các máy khách NFS hỗ trợ khóa floc() bằng cách mô phỏng chúng dưới dạng khóa phạm vi byte fcntl(2) trên toàn bộ tệp. Điều này có nghĩa là các khóa fcntl(2) và floc() tương tác với một
   khác trên NFS. Điều đó cũng có nghĩa là để đặt khóa độc quyền, tệp phải được mở để ghi.

   Kể từ Linux 2.6.37, nhân hỗ trợ chế độ tương thích cho phép các khóa flo() (và cả các khóa vùng byte fcntl(2)) được coi là cục bộ; xem cuộc thảo luận về local_lock
   tùy chọn trong nfs (5).

Bạn chỉ mở tệp để đọc, đó là lý do tại sao cuộc gọi bầy không thành công.

Julia Fischer avatar
lá cờ ph
Cảm ơn. Bạn đã trả lời câu hỏi của tôi. Tôi phải đọc trang người đàn ông
Martin avatar
lá cờ kz
tuyệt vời! Nếu câu trả lời của tôi giải quyết được câu hỏi của bạn, vui lòng đánh dấu nó là câu trả lời được chấp nhận ...

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.