IPC通信机制-信号量集
1.int semget(key_t key,int nsems, int semflg);
第一个参数是由ftok()获取的key ,
第二个参数是要创建的信号量的个数,如果是0表示获取信号量集ID
第三个参数是IPC_CREAT,创建信号量集ID。
返回一个信号量集的ID semid.
semid=semget(key,10,IPC_CREAT|0660);
2. int semop(int semid,struct sembuf *sops,unsigned nsops);
第一个参数是 信号量集的ID,
第二个参数是要操作的结构体;
struct sembuf {
unsinged short sem_num; 要对哪个信号量进行操作 0表示第一个;
short sem_op; 要进行什么操作,正数表示释放信号量,负数表示使用信号量;
short sem_flg; IPC_NOWAIT
}
第三个参数是指 sops 结构体的个数,恒大于或等于1;
3. int semctl(int semid,int semnum,int cmd,...);
第一个参数是信号量集的ID;
第二个参数是对第几个信号量进行操作,0代表第一个;
第三个参数是要进行什么操作;
可以有第四个参数,第四个参数是一个联合:
union semun{
int val; /* Value for SETVAL */
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* Array for GETALL, SETALL */
struct seminfo *__buf; /* Buffer for IPC_INFO (Linux-specific) */
}
struct seminfo {
int semmap; /* Number of entries in semaphore
map; unused within kernel */
int semmni; /* Maximum number of semaphore sets */
int semmns; /* Maximum number of semaphores in all
semaphore sets */
int semmnu; /* System-wide maximum number of undo
structures; unused within kernel */
int semmsl; /* Maximum number of semaphores in a
set */
int semopm; /* Maximum number of operations for
semop(2) */
int semume; /* Maximum number of undo entries per
process; unused within kernel */
int semusz; /* Size of struct sem_undo */
int semvmx; /* Maximum semaphore value */
int semaem; /* Max. value that can be recorded for
semaphore adjustment (SEM_UNDO) */
};
struct semid_ds {
struct ipc_perm sem_perm; /* Ownership and permissions */
time_t sem_otime; /* Last semop time */
time_t sem_ctime; /* Last change time */
unsigned short sem_nsems; /* No. of semaphores in set */
};
struct ipc_perm {
key_t __key; /* Key supplied to semget(2) */
uid_t uid; /* Effective UID of owner */
gid_t gid; /* Effective GID of owner */
uid_t cuid; /* Effective UID of creator */
gid_t cgid; /* Effective GID of creator */
unsigned short mode; /* Permissions */
unsigned short __seq; /* Sequence number */
};
第三个参数:
IPC_STAT 读取一个信号量集的数据结构semid_ds,并将其存储在semun中的buf参数中。
IPC_SET 设置信号量集的数据结构semid_ds中的元素ipc_perm,其值取自semun中的buf参数。
IPC_RMID 将信号量集从内存中删除。
GETALL 用于读取信号量集中的所有信号量的值。
GETNCNT 返回正在等待资源的进程数目。
GETPID 返回最后一个执行semop操作的进程的PID。
GETVAL 返回信号量集中的一个单个的信号量的值。
GETZCNT 返回这在等待完全空闲的资源的进程数目。
SETALL 设置信号量集中的所有的信号量的值。
SETVAL 设置信号量集中的一个单独的信号量的值。
返回值:
根据不同的cmd返回不同的值;
GETNCNT the value of semncnt.
GETPID the value of sempid.
GETVAL the value of semval.
GETZCNT the value of semzcnt.
其他cmd成功返回0;
1.int semget(key_t key,int nsems, int semflg);
第一个参数是由ftok()获取的key ,
第二个参数是要创建的信号量的个数,如果是0表示获取信号量集ID
第三个参数是IPC_CREAT,创建信号量集ID。
返回一个信号量集的ID semid.
semid=semget(key,10,IPC_CREAT|0660);
2. int semop(int semid,struct sembuf *sops,unsigned nsops);
第一个参数是 信号量集的ID,
第二个参数是要操作的结构体;
struct sembuf {
unsinged short sem_num; 要对哪个信号量进行操作 0表示第一个;
short sem_op; 要进行什么操作,正数表示释放信号量,负数表示使用信号量;
short sem_flg; IPC_NOWAIT
}
第三个参数是指 sops 结构体的个数,恒大于或等于1;
3. int semctl(int semid,int semnum,int cmd,...);
第一个参数是信号量集的ID;
第二个参数是对第几个信号量进行操作,0代表第一个;
第三个参数是要进行什么操作;
可以有第四个参数,第四个参数是一个联合:
union semun{
int val; /* Value for SETVAL */
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* Array for GETALL, SETALL */
struct seminfo *__buf; /* Buffer for IPC_INFO (Linux-specific) */
}
struct seminfo {
int semmap; /* Number of entries in semaphore
map; unused within kernel */
int semmni; /* Maximum number of semaphore sets */
int semmns; /* Maximum number of semaphores in all
semaphore sets */
int semmnu; /* System-wide maximum number of undo
structures; unused within kernel */
int semmsl; /* Maximum number of semaphores in a
set */
int semopm; /* Maximum number of operations for
semop(2) */
int semume; /* Maximum number of undo entries per
process; unused within kernel */
int semusz; /* Size of struct sem_undo */
int semvmx; /* Maximum semaphore value */
int semaem; /* Max. value that can be recorded for
semaphore adjustment (SEM_UNDO) */
};
struct semid_ds {
struct ipc_perm sem_perm; /* Ownership and permissions */
time_t sem_otime; /* Last semop time */
time_t sem_ctime; /* Last change time */
unsigned short sem_nsems; /* No. of semaphores in set */
};
struct ipc_perm {
key_t __key; /* Key supplied to semget(2) */
uid_t uid; /* Effective UID of owner */
gid_t gid; /* Effective GID of owner */
uid_t cuid; /* Effective UID of creator */
gid_t cgid; /* Effective GID of creator */
unsigned short mode; /* Permissions */
unsigned short __seq; /* Sequence number */
};
第三个参数:
IPC_STAT 读取一个信号量集的数据结构semid_ds,并将其存储在semun中的buf参数中。
IPC_SET 设置信号量集的数据结构semid_ds中的元素ipc_perm,其值取自semun中的buf参数。
IPC_RMID 将信号量集从内存中删除。
GETALL 用于读取信号量集中的所有信号量的值。
GETNCNT 返回正在等待资源的进程数目。
GETPID 返回最后一个执行semop操作的进程的PID。
GETVAL 返回信号量集中的一个单个的信号量的值。
GETZCNT 返回这在等待完全空闲的资源的进程数目。
SETALL 设置信号量集中的所有的信号量的值。
SETVAL 设置信号量集中的一个单独的信号量的值。
返回值:
根据不同的cmd返回不同的值;
GETNCNT the value of semncnt.
GETPID the value of sempid.
GETVAL the value of semval.
GETZCNT the value of semzcnt.
其他cmd成功返回0;