flock (fd, LOCK_UN) возвращает 0, но файл все еще заблокирован - PullRequest
1 голос
/ 26 мая 2020

По какой-то причине flock (fd, LOCK_UN) возвращает 0, и файл все еще заблокирован со второй итерации. Таким образом, в первый раз файл разблокируется секцией записи, а секция чтения может успешно заблокировать его. Когда i = 1, секция записи больше не может разблокировать файл, и блокировка секции чтения не работает.

Я отредактировал open () следующим образом.

fd = open(filename, O_WRONLY | O_APPEND| O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO);

После того, как я это сделал, все блокировки и разблокировки работают. Эти параметры предоставляют пользователю права на чтение, запись и выполнение. Итак, я предполагаю, что после удаления файла что-то пойдет не так. Теперь я добавил perror () к каждой проверке, и во время второй итерации (i = 1) блокировка секции чтения завершается с ошибкой «Плохой дескриптор файла». Может кто-нибудь мне это объяснить?

// Tell the headers to use the POSIX extension
#if __STDC_VERSION__ >= 199901L
#define _XOPEN_SOURCE 600
#else
#define _XOPEN_SOURCE 500
#endif /* __STDC_VERSION__ */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/file.h>
#include <errno.h>

#define POLL_WAIT_TIME_S 2

const char testString[] = "Test test test\n";

int main() {

    int fd;                                                                     // Create file descriptor variable
    char *buff = (char *) calloc(255, sizeof(char));            // Create buffer for read()
    char* filename = "testfile";                                                // Set filename
    int status;

    while(1) {

        // Create a file and write a text into it
        fd = open(filename, O_WRONLY | O_APPEND| O_CREAT);                          // Create file descriptor
        printf("%d\n", fd);

        status = flock(fd, LOCK_EX);                                                // Lock file using file descriptor
        if(status == 0) 
            printf("\"%s\" locked successfully by write process!\n", filename);
        else {
            printf("\"%s\" not locked successfully by write process!\n", filename);
            perror("Error: ");
        }



        size_t charsWritten = write(fd, testString,  sizeof(testString));                           // Write to file using file descriptor
        printf("%ld characters written to \"%s\" \n", charsWritten, filename);

        if(status == 0) {
            status = flock(fd, LOCK_UN);
            if(status == 0) 
                printf("\"%s\" unlocked by write process!\n", filename);
            else {
                printf("\"%s\" could not be unlocked by write process!\n", filename);
                perror("Error: ");
            }

        }

        close(fd);                                                                  // Close file descriptor

        // Open a file and read its content
        fd = open(filename, O_RDONLY);

        status = flock(fd, LOCK_EX);                                                // Lock file using file descriptor
        if(status == 0) { 
            printf("\"%s\" locked successfully by read process!\n", filename);
            printf("\nReading file content: \n");
            size_t sz = read(fd, buff, (size_t) sizeof(testString));
            buff[sz] = '\0';
            printf("%s", buff);                                                         // Print buffer content to the screen
            printf("\n");
        }
        else {
            printf("\"%s\" not locked successfully by read process!\n", filename);
            perror("Error: ");
        }

        if(status == 0) {
            status = flock(fd, LOCK_UN);
            if(status == 0) 
                printf("\"%s\" unlocked by read process!\n", filename);
            else {
                printf("\"%s\" could not be unlocked by read process!\n", filename);
                perror("Error: ");
            }
        }

        close(fd);

        // Delete the file
        if(remove(filename) == 0)
            printf("\"%s\" deleted successfully!\n", filename);
        else {
            printf("Unable to delete %s\n", filename);
            perror("Error: ");
        }

        printf("\n");
        sleep(POLL_WAIT_TIME_S);
    }   

    free(buff);
    return 0;
}


...