【问题标题】:Allow opening a file with open() only in one process, in c unix programming在 c unix 编程中,只允许在一个进程中使用 open() 打开文件
【发布时间】:2015-06-26 07:54:13
【问题描述】:

我正在创建一个应用程序客户端/服务器。注册的用户位于他们的特定文件中。我需要我的客户只有一个进程可以使用该特定用户名登录。所以我认为最好的处理方法是禁止打开一个文件,如果它刚刚被另一个进程打开,但我不知道该怎么做。建议?谢谢! 我考虑过信号量,但我认为这不是最好的解决方案....

好的,我会使用flock() 谢谢! ^^ 但是在 open() 之后会给我什么样的错误呢?

【问题讨论】:

  • 文件锁定通常是在没有服务器的情况下完成的。

标签: c file sockets unix server


【解决方案1】:

查看名为flock 的系统命令/shell 命令。

因此,由于您只希望一个进程访问打开的文件,因此您将对文件描述符使用LOCK_EX 操作(假设您正在使用系统调用)。

请浏览手册页。 man flock 用于 shell 命令,man 2 flock 用于系统调用。

【讨论】:

  • @iharob:那是你在那里做的一个奇怪的编辑;复制粘贴失败?
  • @MartijnPieters 哎呀……确实……我觉得所有代码的来源都很奇怪?
  • @iharob:当帖子在编辑后看起来很奇怪时,请务必检查编辑历史以了解发生了什么。 :-)
  • @iharob:在这种情况下,额外的文本来自this question you also edited;您的剪贴板中一定还有它。
【解决方案2】:

如果您有一个处理所有用户的多线程服务器(但只有一个进程),那么最好只跟踪内存中的登录用户。在这种情况下,您可以使用互斥锁(一种信号量)来确保一个连接锁定对特定用户配置文件的访问,并且每次新用户连接时,您都可以查询您的数据结构。例如,如果您使用 pthreads,您可以如下定义一个数组,假设每个用户都有一个连续的整数 ID:

pthread_mutex_t YourServer::accountLocks[numberOfUsers]

如果您有多个单独的进程由于某种原因无法共享内存,则可以选择锁定文件。在这种情况下,您必须小心不要引入竞争条件,您可以使用 flock 之类的东西。

【讨论】:

【解决方案3】:

您可以使用flock() 并在该文件上设置排他锁。这将阻止设置锁定打开文件的进程以外的其他进程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 2020-03-01
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多