Нужно написать функции для процессов, которые анаогичны функциям
pthread_mutex_lock и pthread_mutex_unlock для pthreads, только через
семафоры.
Прочитал в ALP про IPC. Возможно не все просек.
Делал так.
/* Obtain a binary semaphore s ID, allocating if necessary. */
int binary_semaphore_allocation (key_t key, int sem_flags) {
return semget (key, 1, sem_flags);
}
/* Deallocate a binary semaphore. All users must have finished their
use. Returns -1 on failure. */
int binary_semaphore_deallocate (int semid) {
union semun ignored_argument;
return semctl (semid, 1, IPC_RMID, ignored_argument);
}
int binary_semaphore_initialize (int semid) {
union semun argument;
unsigned short values[1];
values[0] = 1;
argument.array = values;
return semctl (semid, 0, SETALL, argument);
}
/*Это lock*/
int binary_semaphore_wait (int semid) {
struct sembuf operations[1];
/* Use the first (and only) semaphore. */
operations[0].sem_num = 0;
/* Decrement by 1. */
operations[0].sem_op = -1;
/* Permit undo ing. */
operations[0].sem_flg = 0;
return semop(semid, operations, 1);
}
/* Это unlock*/
int binary_semaphore_post (int semid) {
struct sembuf operations[1];
/* Use the first (and only) semaphore. */
operations[0].sem_num = 0;
/* Increment by 1. */
operations[0].sem_op = 1;
/* Permit undo ing. */
operations[0].sem_flg = 0;
return semop (semid, operations, 1);
}
Используется таким макаром.
В предке .
if((mx_hash_semaphore = binary_semaphore_allocation( IPC_PRIVATE,
IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR)) < 0 ){
perror("semget");
exit(-1);
}
if(binary_semaphore_initialize(mx_hash_semaphore)<0){
perror("init");
exit(-1);
}
В потомках
binary_semaphore_wait (mx_hash_semaphore);
//Критические действия
binary_semaphore_post (mx_hash_semaphore);
Но при таком раскладе все чилды иногда зависают на wait и не отвисают
:((((
Подскажите что-нить полезное....
Задача ведь часто встречающаяся.
Или можете прислать аналогичные функции на v_dav@inbox.ru
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум Семафоры (2005)
- Форум Семафоры (2003)
- Форум Семафоры, не правильное отображение строки , язык си (2012)
- Форум Использовать семафоры для взаимного исключения (2018)
- Форум Ошибка: undefined reference to 'shm_unlink' (2010)
- Форум семафоры (2005)
- Форум Почему программа выключается? (2017)
- Форум Разработка своего shell'a (2012)
- Форум Помогите разобраться с sendmsg & recvmsg. (2013)
- Форум Linux+Vortex2=Unreal??? (2003)