Здаравствуйте.
Появилась такая проблема: не могу задать для семафора свой ключ.$tkey=6664665;
$key = sprintf "0x%lx", $tkey;
$sem = new IPC::Semaphore($key, 10, S_IRWXU | IPC_CREAT);Семафор создается, однако при посмотре в таблице ipcs, напротив идентификатора созданного программой семафора ключ равен 0. Подскажите пожалуйста где ошибка и как ее исправить?
Спасибо.
>Здаравствуйте.
>Появилась такая проблема: не могу задать для семафора свой ключ.Тебе не нужно задавать свой ключ. Это всё равно что задавать свой 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, так ты создаёшь семафор.
>Тебе не нужно задавать свой ключ. Это всё равно что задавать свой
>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;Если я где-то не прав, прошу исправить.
Спасибо.
Пробелему решил.
Вот программа, которая создает множество из $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";Тему счетаю закрытой.
Всем спасибо.