【问题标题】:Isn't there a function like sem_wait in System V Semaphore?System V Semaphore 中没有类似 sem_wait 的函数吗?
【发布时间】:2022-01-14 02:00:20
【问题描述】:

我正在制作一种方式的聊天程序。 但是在客户端程序中,它运行得非常快,所以它向我显示了很多文本。 所以我正在使用 System V 信号量,但它不能使用 sem_wait 我应该使用 POSIX 信号量来像 sem_wait 一样使用吗?

我不会写睡眠。因为我要单独发送大量文件。

【问题讨论】:

  • 最好使用 POSIX 信号量,因为调用比 System V 信号量简单得多。

标签: c linux semaphore


【解决方案1】:

是的,有...但是当您将信号量减到 0 以下时会发生这种情况。Sys V 信号量是 Dijkstra 信号量的一种变体,您可以在其中对一组信号量按顺序执行一组操作 原子地,所以如果它们中的任何一个阻塞了您请求的操作,您将等待。正如您可能知道的那样,当您将信号量的值减小到 0 以下时,信号量会等待(阻塞),并且只有当它再次高于 0 时,它才允许阻塞的进程通过。在 SysV 中,您可以对单个信号量进行递增或递减(如果您只处理一个,并且只递减 1,则该操作将等效于 P() Dijkstra 的调用,而如果您按 N 执行此操作,则该操作将等于 N 次按顺序调用 P()(并且是原子的,由 Unix 内核保证)递增操作等价于 V() Dijkstra 的调用,并且也是以原子方式完成的。内核还维护净量 a进程对信号量进行了操作,以便撤消该进程对信号量所做的所有操作,以防该进程终止。

我希望这已经回答了你的问题。

【讨论】:

    【解决方案2】:

    对 System V IPC 信号量集进行操作的函数是 semop()。如果信号量集有多个成员,它可以在一次调用中同时执行等待和信号操作。

    macOS 手册说:

    #include <sys/sem.h>
    
    int semop(int semid, struct sembuf *sops, size_t nsops);
    

    描述 semop() 系统调用以原子方式在semid 指示的信号量集上执行sops 指示的操作数组。 sops 的长度由nsops 表示。每个操作都编码在一个struct sembuf中,其定义如下:

     struct sembuf {
             u_short sem_num;        /* semaphore # */
             short   sem_op;         /* semaphore operation */
             short   sem_flg;        /* operation flags */
     };
    

    它继续详细说明行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-06
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-23
      相关资源
      最近更新 更多