进程间通讯《一》 sysv semphone
sysv信号灯, 较posix要复杂的很多, 因为多了一个计数信号灯集的概念。
其具体API有如下几个:
key_t ftok(
const
char
*
pathname,
int
proj_id)
该API,是所有sysv进程间通讯共同使用的用来产生一个IPC KEY。
pathname: 本地一个可访问的文件路径
proj_id : 一个整数 在0 ~~ 255之间。
int
semget(key_t key,
int
nsems,
int
oflag)
返回: 成功为非负标识符, 出错为
-
1
,并置相应errno
该API是用来产生一个信号集的描述符。
nsems : 该信号集合的数目
oflag: 标志位, 像IPC_CREAT | IPC_EXCL | 0666;
使用举例:
semid
=
semget(key, SEM_NUM, IPC_CREAT
|
IPC_EXCL
|
0666
);
if
(semid
<
0
)
{
if (errno != EEXIST) return -1;
semid = semget(key, 0, 0666);
if (semid < 0) return -1;
}
当创建一个新的信号灯集合时: 必须指定nsems, 而且,创建后不可修改, 如果访问该信号集,可以指定为0;
int
semctl(
int
semid,
int
semnum,
int
cmd, ...)
返回:成功返回非负值, 出错
-
1
该API是用来初始化信号灯的。
opts.val
=
1
;
res
=
semctl(semid,
0
, SETVAL, opts);
if
(res
<
0
)
return
-
1
;
cmd: 有IPC_STAT, GETVAL等。
由于sysv 信号灯创建和初始化是两个API, 故在多进程的环境下,会产生一个竞态,需要注意。
int
semop(
int
semid,
struct
sembuf
*
sem,
int
nopts)
返回: 成功返回0, 出错为
-
1
;
sysv信号灯, 较posix要复杂的很多, 因为多了一个计数信号灯集的概念。
其具体API有如下几个:

该API,是所有sysv进程间通讯共同使用的用来产生一个IPC KEY。
pathname: 本地一个可访问的文件路径
proj_id : 一个整数 在0 ~~ 255之间。


该API是用来产生一个信号集的描述符。
nsems : 该信号集合的数目
oflag: 标志位, 像IPC_CREAT | IPC_EXCL | 0666;
使用举例:






当创建一个新的信号灯集合时: 必须指定nsems, 而且,创建后不可修改, 如果访问该信号集,可以指定为0;


该API是用来初始化信号灯的。



cmd: 有IPC_STAT, GETVAL等。
由于sysv 信号灯创建和初始化是两个API, 故在多进程的环境下,会产生一个竞态,需要注意。

