Files
MentOS/programs/tests/t_sem1.c
T

92 lines
1.8 KiB
C

//test
#include "ipc/sem.h"
#include "stdio.h"
#include "ipc/ipc.h"
#include "sys/errno.h"
#include "sys/wait.h"
#include "stdlib.h"
#include "sys/unistd.h"
/*
First test of System V Semaphores.
Correct output should be: Corso di Sistemi Operativi.
*/
void semid_print(struct semid_ds *temp){
printf("pid, IPC_KEY, Semid, semop, change: %d, %d, %d, %d, %d\n", temp->owner, temp->key, temp->semid, temp->sem_otime, temp->sem_ctime);
for(int i=0; i<(temp->sem_nsems); i++){
printf("%d semaphore:\n", i+1);
printf("value: %d, pid %d, process waiting %d\n", temp->sems[i].sem_val, temp->sems[i].sem_pid, temp->sems[i].sem_zcnt);
}
}
int main()
{
union semun arg;
struct sembuf sops[6];
sops[0].sem_num = 0;
sops[0].sem_op = -1;
sops[0].sem_flg = 0;
sops[1].sem_num = 1;
sops[1].sem_op = -1;
sops[1].sem_flg = 0;
sops[2].sem_num = 2;
sops[2].sem_op = -1;
sops[2].sem_flg = 0;
sops[3].sem_num = 0;
sops[3].sem_op = 1;
sops[3].sem_flg = 0;
sops[4].sem_num = 1;
sops[4].sem_op = 1;
sops[4].sem_flg = 0;
sops[5].sem_num = 2;
sops[5].sem_op = 1;
sops[5].sem_flg = 0;
int status;
//create a semaphore set
int semid = semget(IPC_PRIVATE, 4, IPC_CREAT);
//set the values of the semaphores
unsigned short values[] = {0,0,0,1};
arg.array = values;
if(semctl(semid,0,SETALL,&arg)==-1)
write(1,"errore set dei semafori",24);
if(!fork()){
semop(semid, &sops[0], 1);
write(1,"Operativi.\n", 11);
exit(0);
}
if(!fork()){
semop(semid, &sops[1], 1);
write(1,"Sistemi ", 8);
semop(semid, &sops[3], 1);
exit(0);
}
if(!fork()){
semop(semid, &sops[2], 1);
write(1," di ", 4);
semop(semid, &sops[4], 1);
exit(0);
}
if(!fork()){
write(1,"Corso", 5);
semop(semid, &sops[5], 1);
exit(0);
}
for(int n=0; n<4; n++){
wait(&status);
}
if(semctl(semid,0,IPC_RMID,0)==-1)
write(1,"err", 3);
return 0;
}