C语言 如何在羊群上增加超时?

wmvff8tz  于 2023-06-05  发布在  其他
关注(0)|答案(2)|浏览(148)

在C编程中,有没有一种方法可以在flock()上实现超时?
谢谢

#include <sys/file.h>

int flock(int fd, int operation);
2admgd59

2admgd591#

您可以使用SIG_ALARM来执行此操作。http://www.gnu.org/software/libc/manual/html_node/Setting-an-Alarm.html这是一种棘手的,虽然,特别是如果你正在处理多线程。你必须确保你的系统将sig alarm传递给总是设置它的线程,但情况可能并非如此...在这种情况下,你需要使用pthread_sigmask http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_sigmask.html来确保只有你的线程启用了信号...但是如果两个线程同时阻塞了flock呢?您需要为此添加某种互斥体 Package 器。

7vux5j2d

7vux5j2d2#

如果由于某种原因无法使用SIGALARM,则其他选项将忙碌等待LOCK_NB。这两个选项都已经提到了,但这里是一个LOCK_NB的例子:

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

int flock_with_timeout(int fd, int timeout) {
    struct timespec wait_interval = { .tv_sec = 1, .tv_nsec = 0 }; // 1 sec
    int wait_total = 0; // Total time spent in sleep

    while (flock(fd, LOCK_EX | LOCK_NB) == -1) {
        if (errno == EWOULDBLOCK) {
            // File is locked by another process
            if (wait_total >= timeout) { // If timeout is reached
                printf("Timeout occurred while waiting to lock file\n");
                return -1;
            }

            sleep(wait_interval.tv_sec);
            wait_total += wait_interval.tv_sec;
        } else {
            perror("flock - failed to lock file");
            return -1;
        }
    }

    return 0;
}

你可以这样使用这个函数:

int main() {
    int fd = open("file.txt", O_WRONLY | O_CREAT, 0640);
    if (fd == -1) {
        perror("open - failed to open file");
        return 1;
    }

    if (flock_with_timeout(fd, 5) != 0) {
        close(fd);
        return 1;
    }

    printf("Got the lock\n");
    /* ... you can work with the file here ... */

    // Don't forget to unlock the file
    if (flock(fd, LOCK_UN) == -1) {
        perror("flock - failed to unlock file");
        close(fd);
        return 1;
    }

    close(fd);
    return 0;
}

注1:如果你退出main()并因此终止程序,你不需要解锁,也不需要关闭文件句柄。这将自动完成。
注2:close()也可能失败,应该进行错误检查。
注3:正如@MK已经提到的,LOCK_NB的问题是,您将延迟到您的睡眠时间才能获得锁,这可能是不可接受的。在这个例子中,我们睡了一秒钟。

相关问题