Лекции по курсу "Системное программирование для UNIX". Литвинов Д.Г. - 71 стр.

UptoLike

Составители: 

71
case 'd': opensem(&semset_id, key);
removesem(semset_id);
break;
case 'm': opensem(&semset_id, key);
changemode(semset_id, argv[2]);
break; default: usage();
}
return(0);
}
void opensem(int *sid, key_t key)
{
/* Открываем множество семафоров - не создаем! */
if((*sid = semget(key, 0, 0666)) == -1)
{
printf("Semaphore set does not exist!\n");
exit(1);
}
}
void createsem(int *sid, key_t key, int members)
{
int cntr;
union semun semopts;
if(members > SEMMSL) {
printf("Sorry, max number of semaphores in a set is %d\n",
SEMMSL);
exit(1);
}
printf("Attempting to create new semaphore set with %d
members\n",
members);
if((*sid = semget(key, members, IPC_CREAT|IPC_EXCL|0666)) == -1)
{
fprintf(stderr, "Semaphore set already exists!\n");
exit(1);
}
semopts.val = SEM_RESOURCE_MAX;
/* Инициализируем все элементы (может быть сделано с SETALL) */
for(cntr=0; cntr<members; cntr++)
semctl(*sid, cntr, SETVAL, semopts);
}void locksem(int sid, int member)
{
struct sembuf sem_lock={ 0, -1, IPC_NOWAIT };
if( member<0 || member>(get_member_count(sid)-1))
{
fprintf(stderr, "semaphore member %d out of range\n", member);
return;
}
/* Попытка запереть множество семафоров */
if(!getval(sid, member))
{
fprintf(stderr, "Semaphore resources exhausted (no lock)!\n");
exit(1);
               case 'd': opensem(&semset_id, key);
                         removesem(semset_id);
                         break;
               case 'm': opensem(&semset_id, key);
                         changemode(semset_id, argv[2]);
                         break;      default: usage();

           }

           return(0);
       }

       void opensem(int *sid, key_t key)
       {
          /* Открываем множество семафоров - не создаем! */

           if((*sid = semget(key, 0, 0666)) == -1)
           {
              printf("Semaphore set does not exist!\n");
              exit(1);
           }

       }

       void createsem(int *sid, key_t key, int members)
       {
          int cntr;
          union semun semopts;

           if(members > SEMMSL) {
              printf("Sorry, max number of semaphores in a set is %d\n",
                      SEMMSL);
              exit(1);
           }

          printf("Attempting to create new semaphore set with %d
members\n",
                  members);

           if((*sid = semget(key, members, IPC_CREAT|IPC_EXCL|0666)) == -1)
           {
              fprintf(stderr, "Semaphore set already exists!\n");
              exit(1);
           }
           semopts.val = SEM_RESOURCE_MAX;

          /* Инициализируем все элементы (может быть сделано с SETALL) */
          for(cntr=0; cntr(get_member_count(sid)-1))
           {
              fprintf(stderr, "semaphore member %d out of range\n", member);
              return;
           }

           /* Попытка запереть множество семафоров */
           if(!getval(sid, member))
           {
              fprintf(stderr, "Semaphore resources exhausted (no lock)!\n");
              exit(1);



                                                                            71