【问题标题】:Using fnctl() to lock and unlock file for read and write (multiple Processes)使用 fnctl() 锁定和解锁文件以进行读写(多个进程)
【发布时间】:2014-06-24 12:18:24
【问题描述】:

我目前正在尝试实现一个并发服务器(即通过分叉新的子进程来处理多个进程)。

每个客户端都执行读/写请求以读取位于服务器中的 file.txt。我目前正在使用fnctl() 来处理同步,即。我可以进行多次读取,但只能进行一次写入。

这是我到目前为止所做的示例代码:

{
    FILE *file = fopen("file.txt", "w+");

    fd = fileno(file);

    printf("\nThis is the file descriptor : %d\n", fd);

    if(file == NULL)
    printf("File cannot be opened");

    printf("\nLocking!!!!");

    //initliazing the flock structure
    memset(&lock, 0, sizeof(lock)); //setting 0 as a value
    lock.l_type = F_WRLCK;  //F_RDLCK, F_WRLCK, F_UNLCK
    lock.l_whence = SEEK_SET;  //SEEK_SET, SEEK_CUR, SEEK_END
    lock.l_start = 0;   //offset from l_whence
    lock.l_len = 0;   //length, 0 = to EOF
    lock.l_pid = getpid(); //the processes's PID


    //placing a write lock on the file
    fcntl(fd, F_SETLKW, &lock);

    printf("\nLocked-------");

    fwrite(buff + 1, 1, strlen(buff) - 1, file);
    //lock_realease(&l);
    printf("\nHit enter to unlock the file !");
    getchar();

    printf("\nFinished writing so we can unlock file !");

    //Releasing lock
    lock.l_type = F_UNLCK;  //unlocks the region of the file
    fcntl(fd, F_SETLKW,&lock);

    printf("\nFile unlocked!");
}

如果我的方向正确,有人可以指导我吗?

【问题讨论】:

    标签: c linux client-server


    【解决方案1】:

    也许吧。您必须添加错误处理(以便您在锁定失败时注意到)、等待(锁定失败时)和超时(当另一个孩子被卡住并且永远不会释放锁定时)。

    但根据我的经验,这个过程很脆弱。而是创建一个套接字。让孩子们连接到插座。然后使用主进程向子进程提供命令。在这种情况下,主进程替换单个文件。

    这有几个优点:

    • 主进程密切关注子进程的状态(他们正在做什么),您可以编写一个工具来查看此统计信息。稍后,您可以将其用于运行状况监控。
    • 您不需要使用套接字锁定。

    【讨论】:

    • 您能给我一些关于如何执行此类错误处理和等待的指导吗?
    • 对于错误处理,您需要查看您调用的函数的手册。通常,您必须检查您调用的所有函数的返回值。对于等待,这更复杂。你需要找到一个让你的孩子睡觉的函数和一个循环,以及在你等待太久时注意到的一些方法。
    • 我已经按照说明对函数进行了错误处理。但是,我仍然不清楚等待功能。我应该执行等待锁状态“解锁”的等待吗?我认为这个功能是由 F_SETLKW 执行的。它阻塞了其他写进程,当文件被解锁时,下一个等待的阻塞进程获得锁,不是吗?感谢您的帮助!
    • 啊,你是对的。 F_SETLKW 块。这意味着您需要一个警报来执行超时。这是一些代码:unix.com/programming/…
    • 好的,我看到了帖子……但这是否意味着我需要创建一个信号处理程序……只是为了让您知道我们必须遵守预定义的标头,因此我们无法创建新方法....有任何反馈吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    相关资源
    最近更新 更多