-
Notifications
You must be signed in to change notification settings - Fork 54
semop
果冻虾仁 edited this page Aug 22, 2017
·
3 revisions
该函数的操作对象为信号量,而非信号量集合。这是一个原子操作。
为semaphore operate
的缩写
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semop(int semid, struct sembuf *sops, unsigned nsops);
int semtimedop(int semid, struct sembuf *sops, unsigned nsops,
struct timespec *timeout);
要操作的信号量集合标识符
此结构体为:
struct sembuf {
unsigned short sem_num; /* 数组中的信号量下标 */
short sem_op; /* 信号量操作 */
short sem_flg; /* 操作标识 */
};
成员解读:
- sembuf为信号量的编号
- sem_op是要进行的操作(PV操作):
- 如果为正整数,表示增加信号量的值(若为3,则加上3)
- 如果为负整数,表示减小信号量的值
- 如果为0,表示对信号量当前值进行是否为0的测试
- sem_flg为操作标识:
- IPC_NOWAIT:如果不能对信号量集合进行操作,则立即返回
- SEM_UNDO:当进程退出后,该进程对sem进行的操作将撤销
信号量是最早出现的用来解决进程同步与互斥问题的机制。
P原语操作的动作是:
- sem减1;
- 若sem减1后仍大于或等于零,则进程继续执行;
- 若sem减1后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转进程调度。
V原语操作的动作是:
- sem加1;
- 若相加结果大于零,则进程继续执行;
- 若相加结果小于或等于零,则从该信号的等待队列中唤醒一等待进程,然后再返回原进程继续执行或转进程调度。
Talk is cheap, show me the code!
C语言API包含部分
标准C的API、POSIX标准的系统编程API(一些Linux独有的系统API会单独注明)。
大部分头文件源码在/usr/include
目录下。
因为涉及到大量的POSIX编程。所以最好下载POSIX函数的man手册。
apt-get install manpages-posix
apt-get install manpages-posix-dev
默认安装了manpages-dev
,所以不装POSIX的man手册是可以查看绝大部分API的。
但是不装的话,有些API是不能看到的,比如posix_spawn
函数。
yum install man-pages.noarch
关于目录
左侧的目录并非以函数为索引依据,主要是以系统的man手册页面为索引依据。
比如exec里面包含6个函数、pipe里面包含pipe()和pipe2()两个函数,但是它们都是属于一个man页面中。