每个信号量都具有一个非负的值,且信号量支持等待和投递操作。系统调用 semop 实现了这两个操作。它的第一个参数是信号量的标识符,第二个参数是一个包含 struct sembuf 类型元素的数组;这些元素指明了您希望执行的操作。第三个参数是这个数组的长度。结构体sembuf中包含如下字段:
sem_num将要执行操作的信号量组中包含的信号量数量。 sem_op是一个指定了操作类型的整数。 如果sem_op是一个正整数,则这个值会立刻被加到信号量的值上。 [BR]如果 sem_op 为负,则将从信号量值中减去它的绝对值。如果这将使信号量的值小于零,则这个操作会导致进程阻塞,直到信号量的值至少等于操作值的绝对值(由其它进程增加它的值)。 [BR]如果 sem_op 为0,这个操作会导致进程阻塞,直到信号量的值为零才恢复。 sem_flg 是一个符号位。指定 IPC_NOWAIT 以防止操作阻塞;如果该操作本应阻塞,则semop调用会失败。如果为sem_flg指定SEM_UNDO,Linux会在进程退出的时候自动撤销该次操作。 代码 5.4 展示了二元信号量的等待和投递操作。
代码 5.4 (sem_pv.c)二元信号量等待和投递操作
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
/* 等待一个二元信号量。阻塞直到信号量的值为正,然后将其减1 */
int binary_semaphore_wait (int semid)
{
struct sembuf operations[1]
/* 使用(且仅使用)第一个信号量 */
operations[0].sem_num = 0
/* 减一。 */
operations[0].sem_op = -1
/* 允许撤销操作 */
operations[0].sem_flg = SEM_UNDO
return semop (semid, operations, 1)
}
/* 对一个二元信号量执行投递操作:将其值加一。 这个操作会立即返回。*/
int binary_semaphore_post (int semid)
{
struct sembuf operations[1]
/* 使用(且仅使用)第一个信号量 */
operations[0].sem_num = 0
/* 加一 */
operations[0].sem_op = 1
/* 允许撤销操作 */
operations[0].sem_flg = SEM_UNDO
return semop (semid, operations, 1)
}
指定 SEM_UNDO 标志解决当出现一个进程仍然持有信号量资源时被终止这种特殊情况时可能出现的资源泄漏问题。当一个进程被有意识或者无意识地结束的时候,信号量的值会被调整到“撤销”了所有该进程执行过的操作后的状态。例如,如果一个进程在被杀死之前减小了一个信号量的值,则该信号量的值会增长。
v9.5_linuxia32_client v9.1_linuxia32_client v9.5_linuxia32_rtcl v9.1_linuxia32_rtcl 都试过,一样的问题,2009-03-21-23.03.18.302086+480 I1G1273LEVEL: Event
PID : 7057 TID : 3086858848 PROC : db2flacc
INSTANCE: db2inst1 NODE : 000
FUNCTION: DB2 UDB, RAS/PD component, pdLogInternal, probe:120
START : New Diagnostic Log file
DATA #1 : Build Level, 128 bytes
Instance "db2inst1" uses "32" bits and DB2 code release "SQL09014"
with level identifier "01050107".
Informational tokens are "DB2 v9.1.0.4", "s080122", "MI00228", Fix Pack "4a".
DATA #2 : System Info, 436 bytes
System: Linux fsmsreds.localdomain 6 2 i686
CPU: total:4 online:4 Cores per socket:2 Threading degree per core:2
Physical Memory(MB): total:2026 free:1218
Virtual Memory(MB): total:6122 free:5314
Swap Memory(MB): total:4096 free:4096
Kernel Params: msgMaxMessageSize:8192 msgMsgMap:16384 msgMaxQueueIDs:16
msgNumberOfHeaders:16384 msgMaxQueueSize:16384
msgMaxSegmentSize:16 shmMax:33554432 shmMin:1 shmIDs:4096
shmSegments:4096 semMap:32000 semIDs:128 semNum:32000
semUndo:32000 semNumPerID:250 semOps:32 semUndoSize:20
semMaxVal:32767 semAdjustOnExit:32767
Information in this record is only valid at the time when this file was
created (see this record's time stamp)
2009-03-21-23.03.18.301693+480 I1275G297 LEVEL: Event
PID : 7057 TID : 3086858848 PROC : db2flacc
INSTANCE: db2inst1 NODE : 000
FUNCTION: DB2 UDB, config/install, sqlfLogUpdateCfgParam, probe:30
CHANGE : CFG DBM: "Sysadm_group" From: "" To: "db2grp1"
2009-03-21-23.03.19.424445+480 I1573G350 LEVEL: Event
PID : 7066 TID : 3086858848 PROC : db2flacc
INSTANCE: db2inst1 NODE : 000
FUNCTION: DB2 UDB, config/install, sqlfLogUpdateCfgParam, probe:30
CHANGE : CFG DBM: "JDK_path" From: "/home/db2linux/sqllib/java/jdk32" To: "/home/db2inst1/sq
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)