- 论坛徽章:
- 0
|
信号灯建立后,锁定它没有反应,直到我将informix关闭后才执行
关于信号灯的辕马如下:望各位给我看看:
//锁定信号灯
void P(int sem_set_id)
{
struct sembuf sem_op;
//等待信号灯, 直到它的数值非负数
sem_op.sem_num = 0;
sem_op.sem_op = -1;
sem_op.sem_flg = 0;
semop(sem_set_id, &sem_op, 1);
printf("锁定信号灯" ;
}//end of P()
//信号灯解锁
void V(int sem_set_id)
{
struct sembuf sem_op;
//增加信号灯的数值
sem_op.sem_num = 0;
sem_op.sem_op = 1;
sem_op.sem_flg = 0;
semop(sem_set_id, &sem_op, 1);
printf("解锁信号灯" ;
}//end of V()
int Init()
{
int sem_set_id; //信号灯的ID
struct shmid_ds *ps;
int flag = 0; // 0 --- 新建共享内存 1 --表示共享内存已存在
union sem {
struct shmid_ds *ps;
int val;
}sem_val;
int rc;
//建立信号灯
sem_set_id = semget(SEM_ID, 1, IPC_CREAT | 0660);
if (sem_set_id == -1) {
perror("main: semget" ;
exit(1);
}
//设置信号灯的数值是 1
sem_val.val = 1;
rc = semctl(sem_set_id, 0, SETVAL, sem_val);
if (rc == -1) {
perror("main: semctl" ;
exit(1);
}
//建立field共享内存
pScreDoc->;iShmFieldId = shmget(SHM_FIELD_ID, SHARE_FIELD_MEMORY_LEN, IPC_CREAT | IPC_EXCL | 0660);
if (pScreDoc->;iShmFieldId == -1)
{
pScreDoc->;iShmFieldId = shmget(SHM_FIELD_ID, SHARE_FIELD_MEMORY_LEN, IPC_CREAT | 0660);
if(pScreDoc->;iShmFieldId == -1)
{
perror(" Field shmget: " ;
exit(1);
};
flag = 1;
}//end of if
//attach 共享内存
pScreDoc->;shmField = (char *)shmat(pScreDoc->;iShmFieldId, NULL, 0);
if (!pScreDoc->;shmField) {
perror("main: shmat: " ;
exit(1);
}//end of if
if(1)//!flag)
{
printf("attach 共享内存" ;
P(pScreDoc->;iShmFieldId);
memset(pScreDoc->;shmField,0,SHARE_FIELD_MEMORY_LEN);
LoadFieldLib("/usr/wuliu/screen/data/field.xml" ;
V(pScreDoc->;iShmFieldId);
}//end of if
flag = 0; |
|