URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5672
[ Назад ]

Исходное сообщение
"Perl и ключ для семафора"

Отправлено Vankovski , 29-Авг-06 10:19 
Здаравствуйте.
Появилась такая проблема: не могу задать для семафора свой ключ.

$tkey=6664665;
$key = sprintf "0x%lx", $tkey;
$sem = new IPC::Semaphore($key, 10, S_IRWXU | IPC_CREAT);

Семафор создается, однако при посмотре в таблице ipcs, напротив идентификатора созданного программой семафора ключ равен 0. Подскажите пожалуйста где ошибка и как ее исправить?

Спасибо.


Содержание

Сообщения в этом обсуждении
"Perl и ключ для семафора"
Отправлено ACCA , 30-Авг-06 00:47 
>Здаравствуйте.
>Появилась такая проблема: не могу задать для семафора свой ключ.

Тебе не нужно задавать свой ключ. Это всё равно что задавать свой pid для процесса.

Для semop нужен id, который не равен key. id можно получить.

man semop
man IPC::Semaphore


>$tkey=6664665;
>$key = sprintf "0x%lx", $tkey;
>$sem = new IPC::Semaphore($key, 10, S_IRWXU | IPC_CREAT);
>
>Семафор создается, однако при посмотре в таблице ipcs, напротив идентификатора созданного программой

Создаётся 10 семафоров.

>семафора ключ равен 0. Подскажите пожалуйста где ошибка и как ее
>исправить?

$key должен быть равен IPC_PRIVATE, так ты создаёшь семафор.


"Perl и ключ для семафора"
Отправлено Vankovski , 30-Авг-06 10:48 
>Тебе не нужно задавать свой ключ. Это всё равно что задавать свой
>pid для процесса.
>
>Для semop нужен id, который не равен key. id можно получить.
>
>man semop
>man IPC::Semaphore

Параметр semid создается системой. Однако, чтобы разные программы могли обращаться к одному и тому же семафору, нужен ключ, который заранее известен. Например в c++ ключ для семафора создается так:
t_key semkey = 0x200;

Однако этот варинт в Perl не прокатывает. В мане написано

Create a new semaphore set associated with KEY . NSEMS  is the number of semaphores in
the set. A new set is created if
*KEY is equal to IPC_PRIVATE
*KEY does not already have a semaphore identifier associated with it, and FLAGS &
IPC_CREAT is true.

>>$tkey=6664665;
>>$key = sprintf "0x%lx", $tkey;
>>$sem = new IPC::Semaphore($key, 10, S_IRWXU | IPC_CREAT);
>>
>>Семафор создается, однако при посмотре в таблице ipcs, напротив идентификатора созданного программой
>
>Создаётся 10 семафоров.

Создается одно множество из 10 семафоров.

>>семафора ключ равен 0. Подскажите пожалуйста где ошибка и как ее
>>исправить?
>
>$key должен быть равен IPC_PRIVATE, так ты создаёшь семафор.
У меня почему-то IPC_PRIVATE равен 0;

Если я где-то не прав, прошу исправить.
Спасибо.


"Perl и ключ для семафора"
Отправлено Vankovski , 30-Авг-06 15:16 
Пробелему решил.
Вот программа, которая создает множество из $nsems семафоров с ключом $IPC_KEY:

#!/usr/bin/perl
use IPC::SysV qw(IPC_STAT IPC_PRIVATE);
use IPC::Semaphore;
    
    $nsems = 10;
    $IPC_KEY = 0x12340000;
    $IPC_CREATE = 0001000;
    $key = new IPC::Semaphore($IPC_KEY, $nsems , 0666 | $IPC_CREATE );
    die if !defined($key);
    print "$key\n";

Тему счетаю закрытой.
Всем спасибо.