我正在制作单向聊天程序。但在客户端程序中,它工作得很快,所以它向我显示了很多文本。所以我使用System V信号量,但它不能使用sem_wait我应该使用POSIX信号量来像sem_wait一样使用吗?
我不会写睡眠。因为我必须单独发送大量的文件。
是的,有…,但当信号量减少到0以下时,就会发生这种情况。Sys V信号量是Dijkstra信号量的一个变体,在该变体中,您可以按原子顺序对一组信号量进行一组操作,因此,如果其中任何一个信号量阻塞了您请求的操作,您将等待。正如你可能知道的,当你将信号量的值e递减到0以下时,信号量会等待(阻塞(,只有当它再次上升到0以上时,它才会允许阻塞的进程通过,该操作将等于按顺序对P((的N次调用(并且原子性地,如Unix内核所保证的(增量操作等效于V((Dijkstra的调用,并且也是以原子方式完成的。内核还维护一个进程对一个信号量所做的净额,以便撤消该进程对信号量所执行的所有操作,以防该进程死亡。
我想这已经回答了你的问题。
对System V IPC信号量集进行操作的函数是semop()
。如果信号量集有多个成员,它可以在单个调用中同时执行等待和信号操作。
macOS手册上写着:
#include <sys/sem.h> int semop(int semid, struct sembuf *sops, size_t nsops);
说明
semop()
系统调用在semid
指示的信号量集上原子地执行sops
指示的操作阵列。CCD_ 5的长度由CCD_。每个操作都编码在struct sembuf
中,定义如下:struct sembuf { u_short sem_num; /* semaphore # */ short sem_op; /* semaphore operation */ short sem_flg; /* operation flags */ };
它继续详细说明行为。