2014-10-24 2 views
1

мы можем создать семафор двумя способами.
1.Почему и когда следует использовать IPC_NEW для создания семафора?

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. Если это специальное значение используется для ключа, системный вызов игнорирует все, кроме наименьшего , значительные 9 бит shmflg и создает новый сегмент разделяемой памяти.

Я не понимаю, что говорится в руководстве. Может кто-нибудь объяснить больше?
Каковы плюсы и минусы использования 1-го метода по второму методу?

Edit: 
IPC_PRIVATE => IPC_NEW 
+0

Вы можете прокручивать вниз к [BUGS раздел страницы руководства] (http://man7.org/linux/man-pages/man2/shmget.2.html#BUGS). –

+0

Спасибо за указание на ошибку. –

+0

@JoachimPileborg вы можете дать ответ? –

ответ

0

Прежде всего вы должны соблюдать эту ошибку

The name choice IPC_PRIVATE was perhaps unfortunate, IPC_NEW would 
    more clearly show its function. 

ok.Just я объяснил, что я знаю о 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. 
+0

Вы правильно взяли всю информацию. Почему нужно использовать 2-й вариант? –

+0

IPC_CREAT: Если семафор с указанным ключом не существует, создайте новый набор. –

+0

1-й метод также делает то же самое? –

Смежные вопросы