我们可以通过两种方式创建信号量。
1。
static unsigned int state = 1 ;
key_t h=ftok(".", state++);
int sem_id=semget(h, no_of_sems, IPC_CREAT|0666);
和
2。
int sem_id =semget(IPC_NEW,no_of_sems,0666|IPC_CREAT);
正如在Linux手册http://man7.org/linux/man-pages/man2/shmget.2.html中提到的那样
IPC_PRIVATE不是标志字段,而是key_t类型。如果这个特别 value用于密钥,系统调用忽略了所有但至少 显着的9位shmflg并创建一个新的共享内存段。
我没有得到手册所说的内容。有人可以解释一下吗?
使用第一种方法优于第二种方法的利弊是什么?
Edit:
IPC_PRIVATE => IPC_NEW
答案 0 :(得分:0)
首先应该观察BUG
The name choice IPC_PRIVATE was perhaps unfortunate, IPC_NEW would
more clearly show its function.
好的。我解释了我对shmget
请参阅shmget
int shmget(key_t key, size_t size, int shmflg);
DESCRIPTION
shmget() returns the identifier of the System V shared memory segment
associated with the value of the argument key. A new shared memory
segment, with size equal to the value of size rounded up to a multiple
of PAGE_SIZE, is created if key has the value IPC_PRIVATE or key isn't
IPC_PRIVATE, no shared memory segment corresponding to key exists, and
IPC_CREAT is specified in shmflg.
在ipc.h
文件IPC_CREAT
中定义为宏
/* resource get request flags */
#define IPC_CREAT 00001000 /* create if key is nonexistent */
#define IPC_EXCL 00002000 /* fail if key exists */
#define IPC_NOWAIT 00004000 /* return error on wait */
如果单独使用IPC_CREAT,shmget()将返回新创建的段的段标识符,或返回具有相同键值的段的标识符。如果IPC_EXCL与IPC_CREAT一起使用,则创建新段,或者如果段存在,则调用失败,返回-1。 IPC_EXCL本身是无用的,但是当与IPC_CREAT结合使用时,它可以用作保证不打开现有段以进行访问的工具。
如果满足下列条件之一,则为密钥创建至少大小字节的共享内存标识符和关联数据结构以及共享内存段:
o The key argument is equal to IPC_PRIVATE.
o The key argument does not already have a shared memory
identifier associated with it, and (shmflg&IPC_CREAT)
is true.