semop函数的不理解:
函数原型:
int semop(int semid, struct sembuf *sops, unsigned nsops);
semid:创建的semid值,semget中返回
struct sembuf *sops:实际是这样的 struct sembuf sops[],传递一个数组
unsigned nsops:表示数组的个数。即我们要操作几个信号量。
***************************************************/
int semctl(int semid, int semnum, int cmd, …);
semnum:表示信号量集合内的某个成员(数组下标)。
cmd:SETVAL
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) */
};
这里我们主要设置value值(几把钥匙)
/***************************************************/
int semget(key_t key, int nsems, int semflg);
nsems:表示要创建几个信号量集合
代码中:
我创建了5个信号量集合,但是semop同时操作两个信号量集,这样会阻塞不继续往下执行,有什么问题呢?
#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
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*/
};
int set_p(int semid)
{
struct sembuf p[2];// = {{0,-1,0},{0,-1,0}};//array index
p[0].sem_num = 0;
p[0].sem_op = -1;
p[0].sem_flg = 0;
p[1].sem_num = 0;
p[1].sem_op = -1;
p[1].sem_flg = 0;
semop(semid,p,2);//means how many key
}
int set_v(int semid)
{
struct sembuf p[2];// = {{0,1,0},{0,1,0}};// array index
p[0].sem_num = 0;
p[0].sem_op = 1;
p[0].sem_flg = 0;
p[1].sem_num = 0;
p[1].sem_op = 1;
p[1].sem_flg = 0;
semop(semid,p,2);
}
int main()
{
int semid,ret,i;
semid = semget(0x1234,5,0666|IPC_CREAT); // 5 means how many sem you want to creat
if(semid == -1)
{
perror("semget error.\n");
}
union semun test;
test.val = 1; // means how many key
ret = semctl(semid,0,SETVAL,test);//0 means which array(sem jihe),you want to use.array[0],[1],[2].[3],[4]
ret = semctl(semid,1,SETVAL,test);//1 means which array(sem jihe),you want to use.array[0],[1],[2].[3],[4]
if(ret < 0)
{
perror("semctl error..\n");
}
pid_t pid = fork();
for(i = 0; i < 10; i++)
{
set_p(semid);
printf("my pid is %d \n",pid);
sleep(1);
set_v(semid);
}
}