Именованные семафоры) (в FreeBSD 5.2.1)

Модератор: Модераторы разделов

dest
Сообщения: 7

Именованные семафоры)

Сообщение dest »

Привет всем!
Пишу тут программу, в которой некоторое количество процессов (<= 10) должно работать с разделяемой памятью.
И пришло мне в голову использовать именованный семафор, чтобы решить сразу две задачи - обеспечить монопольный доступ к разделяемой памяти, и ограничить сверху количество одновременно запущенных процессов.
Компилируется и собирается всё нормально, а при запуске падает в кору((
Bad system call (core dumped)


Думал, может где в другом месте грабли - написал простейшую программу:

Код: Выделить всё

#include <semaphore.h>
#include <stdio.h>
#include <fcntl.h>

#define PATH_MAX 255

char *
px_ipc_name(const char *name)
{
    char *dir, *dst, *slash;

    if ( (dst = malloc(PATH_MAX)) == NULL)
        return NULL;

    if ( (dir = getenv("PX_IPC_NAME")) == NULL) {
        #ifdef POSIX_IPC_PREFIX
            dir = POSIX_IPC_PREFIX;
        #else
            dir = "/tmp/";
        #endif
    }

    slash = (dir[strlen(dir) - 1] == '/') ? "" : "/";
    snprintf(dst, PATH_MAX, "%s%s%s", dir, slash, name);

    return (dst);
}


int
main()
{
    sem_t *sem;

    sem = sem_open(px_ipc_name("sem1"), O_CREAT | O_EXCL, 0644, 1);

    printf("aagrrrhh");

    sem_close(sem);
    sem_unlink(px_ipc_name("sem1"));

    return 0;
}


Всё равно тот же результат - ффкору (пардон))
Может кто решал подобные проблемы?
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: Именованные семафоры)

Сообщение d_Sun »

dest писал(а):
06.02.2006 14:06
Привет всем!
Пишу тут программу, в которой некоторое количество процессов (<= 10) должно работать с разделяемой памятью.
И пришло мне в голову использовать именованный семафор, чтобы решить сразу две задачи - обеспечить монопольный доступ к разделяемой памяти, и ограничить сверху количество одновременно запущенных процессов.
Компилируется и собирается всё нормально, а при запуске падает в кору((
Bad system call (core dumped)


Думал, может где в другом месте грабли - написал простейшую программу:

Код: Выделить всё

#include <semaphore.h>
#include <stdio.h>
#include <fcntl.h>

#define PATH_MAX 255

char *
px_ipc_name(const char *name)
{
    char *dir, *dst, *slash;

    if ( (dst = malloc(PATH_MAX)) == NULL)
        return NULL;

    if ( (dir = getenv("PX_IPC_NAME")) == NULL) {
        #ifdef POSIX_IPC_PREFIX
            dir = POSIX_IPC_PREFIX;
        #else
            dir = "/tmp/";
        #endif
    }

    slash = (dir[strlen(dir) - 1] == '/') ? "" : "/";
    snprintf(dst, PATH_MAX, "%s%s%s", dir, slash, name);

    return (dst);
}


int
main()
{
    sem_t *sem;

    sem = sem_open(px_ipc_name("sem1"), O_CREAT | O_EXCL, 0644, 1);

    printf("aagrrrhh");

    sem_close(sem);
    return 0;
}


Всё равно тот же эффект - ффкору (пардон))
Может кто решал подобные проблемы?


Я уже об этом писал ;) Поиск рулит! :) Компилите и подгружаете модуль ядра sem, и будет вам счастье. Кстати, об этом написано в man sem_* . :)
Моя подпись сильно длинная :)
Спасибо сказали:
dest
Сообщения: 7

Re: Именованные семафоры)

Сообщение dest »

Поискал по "*sem*" - ничего не нашёл к сожалению.. ((
Может подкините ссылку, если не трудно?

И в мане о модуле ядра sem ничего не увидел
SEM_OPEN(3) FreeBSD Library Functions Manual SEM_OPEN(3)

NAME
sem_open, sem_close, sem_unlink -- named semaphore operations

LIBRARY
Reentrant C Library (libc_r, -lc_r)

SYNOPSIS
#include <semaphore.h>

sem_t *
sem_open(const char *name, int oflag, ...);

int
sem_close(sem_t *sem);

int
sem_unlink(const char *name);

DESCRIPTION
The sem_open() function creates or opens the named semaphore specified by
name. The returned semaphore may be used in subsequent calls to
sem_getvalue(), sem_wait(), sem_trywait(), sem_post() and sem_close().

The following bits may be set in the oflag argument:

O_CREAT Create the semaphore if it does not already exist.

The third argument to the call to sem_open() must be of type
mode_t and specifies the mode for the semaphore. Only the
S_IWUSR, S_IWGRP, and S_IWOTH bits are examined; it is not pos-
sible to grant only ``read'' permission on a semaphore. The
mode is modified according to the process's file creation mask;
see umask(2).

The fourth argument must be an unsigned int and specifies the
initial value for the semaphore, and must be no greater than
SEM_VALUE_MAX.

O_EXCL Create the semaphore if it does not exist. If the semaphore
already exists, sem_open() will fail. This flag is ignored
unless O_CREAT is also specified.

The sem_close() function closes a named semaphore that was opened by a
call to sem_open().

The sem_unlink() function removes the semaphore named name. Resources
allocated to the semaphore are only deallocated when all processes that
have the semaphore open close it.

RETURN VALUES
If successful, the sem_open() function returns the address of the opened
semaphore. If the same name argument is given to multiple calls to
sem_open() by the same process without an intervening call to
sem_close(), the same address is returned each time. If the semaphore
cannot be opened, sem_open() returns SEM_FAILED and the global variable
errno is set to indicate the error.

The sem_close() and sem_unlink() functions return the value 0 if success-
ful; otherwise the value -1 is returned and the global variable errno is
set to indicate the error.

ERRORS
The sem_open() function will fail if:

[EACCES] The semaphore exists and the permissions specified by
oflag at the time it was created deny access to the
this process.

[EACCES] The semaphore does not exist, but permission to create
it is denied.

[EEXIST] O_CREAT and O_EXCL are set but the semaphore already
exists.

[EINTR] The call was interrupted by a signal.

[EINVAL] The sem_open() operation is not supported for the
given name.

[EINVAL] The value argument is greater than SEM_VALUE_MAX.

[ENAMETOOLONG] The name argument is too long.

[ENFILE] The system limit on semaphores has been reached.

[ENOENT] O_CREAT is set but the named semaphore does not exist.

[ENOSPC] There is not enough space to create the semaphore.

The sem_close() function will fail if:

[EINVAL] The sem argument is not a valid semaphore.

The sem_unlink() function will fail if:

[EACCES] Permission is denied to unlink the semaphore.

[ENAMETOOLONG] The specified name is too long.

[ENOENT] The named semaphore does not exist.

SEE ALSO
close(2), open(2), umask(2), unlink(2), sem_getvalue(3), sem_post(3),
sem_trywait(3), sem_wait(3), sem(4)

STANDARDS
The sem_open(), sem_close(), and sem_unlink() functions conform to
ISO/IEC 9945-1:1996 (``POSIX.1'').

HISTORY
Support for named semaphores first appeared in FreeBSD 5.0.

BUGS
This implementation places strict requirements on the value of name: it
must begin with a slash (`/'), contain no other slash characters, and be
less than 14 characters in length not including the terminating null
character.

FreeBSD 5.2.1 January 15, 2003 FreeBSD 5.2.1


Этот модуль где-то качать нужно что-ли?
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: Именованные семафоры)

Сообщение d_Sun »

SEE ALSO
close(2), open(2), umask(2), unlink(2), sem_getvalue(3), sem_post(3),
sem_trywait(3), sem_wait(3), sem(4)


:) Внимательнее надо. В 5.3 он точно был по умолчанию, но где не помню, а FreeBSD сейчас под рукой нет :(

Очереди сообщений POSIX

dest вы определенно издеваетесь :) Я же вам и отвечал :D
Моя подпись сильно длинная :)
Спасибо сказали:
dest
Сообщения: 7

Re: Именованные семафоры)

Сообщение dest »

определенно издеваетесь
- чёртвозьми, извиняюсь, я и забыл совсем :D)))) Я просто тогда по другому задачу решил - с использованием очередей System V, они по умолчанию в ядре

А сейчас прочитал в мане и пересобрал ядро с опцией

Код: Выделить всё

options P1003_1B_SEMAPHORES

(написано, с версии 5.0 в БСД есть)

А прога опять в кору падает((..
Да и чёрт с ними, с именованными семафорами - ещё два вида семафоров есть, опять похоже придётся остановиться на system v

POSIX похоже не в почёте у разработчиков FreeBSD :D
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: Именованные семафоры)

Сообщение d_Sun »

dest писал(а):
06.02.2006 15:12
А прога опять в кору падает((..
Да и чёрт с ними, с именованными семафорами - ещё два вида семафоров есть, опять похоже придётся остановиться на system v

POSIX похоже не в почёте у разработчиков FreeBSD :D


Да я нормально работал с именованными семафорами POSIX в 5.3!!! Попробуйте еще и модуль sem подгрузить!

Вообщем прийду домой посмотрю что к чему. ;)
Моя подпись сильно длинная :)
Спасибо сказали: