C fcntl()不起作用?检查文件是否被锁定

时间:2018-06-24 18:15:00

标签: c locked

因此,此程序将创建一个名为testlock的文件,并将F_RDLCK和F_WRLCK设置到文件的某些区域。代码如下:

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

int main() {
        const char *tfile = "testlock";
        char *byte_to_write = "Z";
        struct flock reg1;
        struct flock reg2;
        int byte_count;
        int res;

        int fd = open(tfile, O_RDWR | O_CREAT , 0666);
        if(fd) {
                for(byte_count = 0; byte_count < 100; byte_count++) {
                        (void)write(fd, byte_to_write, 1);
                }
        }

        reg1.l_type = F_RDLCK;
        reg1.l_whence = SEEK_SET;
        reg1.l_start = 10;
        reg1.l_len = 20;

        reg2.l_type = F_WRLCK;
        reg2.l_whence = SEEK_SET;
        reg2.l_start = 0;
        reg2.l_len = 100;

        printf("Proceso %d\n", getpid());
        res = fcntl(fd, F_SETLK, &reg1);
        if(res != -1) printf("Falló el bloqueo de la reg1 %s\n", strerror(errno));
        res = fcntl(fd, F_SETLK, &reg2);
        if(res != -1) printf("Falló el bloqueo de la reg2 %s\n", strerror(errno));

        sleep(5);

        printf("Proceso %d\n", getpid());
        close(fd);
        exit(EXIT_SUCCESS);
}

要检查第一个程序,我还有另一个要检查文件的锁定类型的文件,如果它是未锁定的,请在文件上写下一些文字。

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

int main(int argc, char *argv[]) {
        if(argc != 2) {
                printf("Vuelve a ejecutar el programa especificando un fichero\n");
                exit(EXIT_FAILURE);
        }

        struct flock fs, fs2;

        // Configuramos el struct que queremos usar para escribir
        fs.l_type = F_WRLCK;
        fs.l_whence = SEEK_SET;
        fs.l_start = 0;
        fs.l_len = 0;
        fs.l_pid = getpid();

        int fd = open(argv[1], O_RDWR | O_EXCL | O_CREAT);
        if(!fd) {
            perror("Error\n");
        } else {
                memset(&fs2, 0, sizeof(fs2));
                int res = fcntl(fd, F_GETLK, &fs2);
                if(res != -1) {
                        perror("F_GETLK ha fallado\n");
                        exit(EXIT_FAILURE);
                } else {
                        if(fs2.l_type != F_UNLCK) {
                                printf("Tipo de cerrojo: bloqueado\n");
                                exit(EXIT_SUCCESS);
                        } else if(fs2.l_type == F_RDLCK || fs2.l_type == F_WRLCK) {
                                printf("Tipo de cerrojo: desbloqueado\n");
                                fcntl(fd, F_SETLKW, &fs);
                                write(fd, "helloworld", 10);
                                sleep(30);
                                printf("Liberando cerrojo...");
                                fs.l_type = F_UNLCK;
                                fcntl(fd, F_SETLK, &fs);
                        }
                }
        }
        close(fd);
        return 0;
}

问题是:

  • 在第一个程序中,我总是收到消息“Fallóel bloqueo de la reg1“和”Fallóel bloqueo de la reg2“,因此fcntl()返回-1,但是 errno包含“成功”,我不知道为什么。可以在 下图。

fcntrl() return -1

  • 在第二个程序中,当我尝试获取之前创建的“ testlock”文件的lockl类型时,总是收到相同的消息“ Tipo de cerrojo:bloqueado”(已锁定),可以在下图看到。

locked

因此,如果有人可以帮助我,我会非常感激,如果代码中有任何错误,请告诉我,我们将不胜感激!

0 个答案:

没有答案