【问题标题】:block on fd which is used as exclusive lock用作排他锁的 fd 上的块
【发布时间】:2013-12-27 05:24:14
【问题描述】:

一个进程(process-1)如下创建一个fd:

fd = open(FILE_PATH, O_CREAT, 0644);

有多个进程试图与 process-1 通信。

他们首先在由 process-1 创建的 fd 上获取排他锁。

flock(fd, LOCK_EX);

如果他们获得锁,他们可以与进程1通信。

无论如何我可以让进程 1 进入睡眠状态,并且只有当其他进程尝试聚集并成功时它才会被唤醒。

基本上我希望 process-1 在它创建的 fd 上阻塞(睡眠)。

根据我的要求,我试着用一种简单的方式来表达。

编辑: 以下有更多细节: https://stackoverflow.com/questions/20715569/block-on-general-file-descriptor

【问题讨论】:

  • 也许你想要epoll?
  • 谢谢,但我不确定 epoll 是否对一般/普通文件描述符有任何作用。我上面描述的 fd 不是套接字 fd。我会试试这个。
  • 你真正想做什么?可能还有其他方法可以实现您的目标,而不是试图强迫它发挥作用。
  • 你可以用一个条件变量或两个信号量来做到这一点。你为什么要强迫这个方案起作用?
  • 首先考虑信号量。服务器与共享内存一起创建 2 个 sem。客户端打开信号量并共享内存。客户端等到他们获得 sem1 并可以写入。客户端发出信号(发布)sem2,以便服务器执行其操作。服务器发布到 sem1,以便下一个客户端可以继续并返回等待 sem2。服务器只是在 sem2 上阻塞,从而消除了整个无休止的旋转循环。

标签: c unix


【解决方案1】:

在文件上使用同步进行进程间通信是非常少见的。

通常 unix 域套接字、管道或 tcp / udp 套接字用于进程间通信。服务器(您的 process-1)设置一个侦听套接字并等待其他进程连接或等待它们发送数据(如果连接已存在)。为此,它可以使用 poll 或 select,或者在线程服务器的情况下,它也可以只使用阻塞读取/recv 来等待来自其他进程的数据。同步不需要锁,因为每个进程都有自己与服务器进程的连接。

请参阅套接字手册页以了解起点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多