Слияние кода завершено, страница обновится автоматически
#include <stdio.h>
#include <unistd.h>
#include <sys/sem.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
extern int semtimedop(int semid, struct sembuf *sops, unsigned nsops,struct timespec *timeout);
union semun{
int val;
struct semid_ds *buf;
unsigned short int *array;
struct seminfo *__buf;
};
int create_sem(int key_id, int count)
{
key_t key;
// key= key_id;
key= ftok(".", key_id);
int semid;
semid= semget(key, count, 0666| IPC_CREAT);
if(-1== semid){
printf("create sem error: %s, semid= %d\n", strerror(errno), semid);
}
return semid;
}
int attach_sem(int key_id, int count)
{
key_t key;
// key= key_id;
key= ftok(".", key_id);
int semid;
semid= semget(key, count, 0);
if(-1== semid){
printf("create sem error: %s, semid= %d\n", strerror(errno), semid);
}
return semid;
}
int free_sem(int semid)
{
union semun ignored_arg;
return semctl(semid, 0, IPC_RMID, ignored_arg);
}
int set_sem_value(int semid, int index, int value)
{
union semun arg;
arg.val= value;
int ret;
ret= semctl(semid, index, SETVAL, arg);
if(-1== ret){
printf("set_sem_value error: %s\n",strerror(errno));
}
return ret;
}
int get_sem_value(int semid, int index)
{
int ret= semctl(semid, index, GETVAL, 0);
if(-1== ret){
printf("get_sem_value error: %s\n",strerror(errno));
}
return ret;
}
int try_lock_sem(int semid, int index, int ms)
{
int ret;
struct sembuf op;
op.sem_num= index;
op.sem_op= -1;
if(ms< 1){
op.sem_flg= IPC_NOWAIT;
ret= semop(semid, &op, 1);
if(-1== ret){
printf("try_lock_sem error: %s\n",strerror(errno));
}
}
else
{
/* to avoid unwanted exited */
op.sem_flg= SEM_UNDO;
struct timespec timeout;
timeout.tv_sec= ms/ 1000;
timeout.tv_nsec= (ms% 1000L)* 1000000L;
ret= semtimedop(semid, &op, 1, &timeout);
if(-1== ret){
printf("try_lock_sem error: %s\n",strerror(errno));
}
}
// if(-1== ret){
// if(errno== EAGAIN) return EAGAIN;
// }
return ret;
}
int lock_sem(int semid, int index)
{
struct sembuf op;
op.sem_num= index;
op.sem_op= -1;
op.sem_flg= SEM_UNDO;
int ret;
ret= semop(semid, &op, 1);
if(-1== ret){
printf("pid[%d] lock_sem error: %s\n", getpid(), strerror(errno));
}
return ret;
}
int unlock_sem(int semid, int index)
{
struct sembuf op;
op.sem_num= index;
op.sem_op= 1;
op.sem_flg= SEM_UNDO;
int ret;
ret= semop(semid, &op, 1);
if(-1== ret){
printf("pid[%d] unlock_sem error: %s, semid=%d index=%d\n", getpid(), strerror(errno), semid, index);
}
return ret;
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )