cn73
01-04-2004, 22:42
Olevo provare a risolvere il calssico problema di IPC del Produttore e Consumatore con buffer limitato (nel mio caso 4 elementi)...
Ho scritto questo codice, ma non funziona :( Dove sbaglio?? E' tutta la sera che ci sbatto la testa!
#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/sem.h>
#define ARRAY_LENGTH 2
#define BUF_DIM 4
main() {
int f;
int in=0,out=0;
int empty,full;
char nextp,nextc;
struct sembuf sops[ARRAY_LENGTH];
int semid;
//char buffer[10];
//char *pun;
semid = semget(IPC_PRIVATE,ARRAY_LENGTH,0666); //4 semafori nel set, r/w x tutti!
printf("prelevato set di semafori id = %d\n",semid);
empty = semctl(semid,0,SETVAL,BUF_DIM);
full = semctl(semid,1,SETVAL,0);
printf("Valore iniziale dei semafori:\n");
printf("EMPTY: %d\n",semctl(semid,0,GETVAL,0));
printf("FULL: %d\n",semctl(semid,1,GETVAL,0));
f = fork();
if (f == -1)
{
fprintf(stderr,"fork fallita\n");
exit(1);
}
else if (f !=0) { //P
while (1){
//nextp = 'x';
printf("\n(P) -- wait(empty) -- tento di decrementare il semaforo EMPTY %d\n",semctl(semid,0,GETVAL,0));
//wait(empty) se il valore del sem EMPTY è 0 nn mi fa andare avanti!!
sops[0].sem_num = 0; /* operazione sul semaforo 1 */
sops[0].sem_op = -1; /* decrementa il semaforo di 1 */
sops[0].sem_flg = 0; /* che fare: wait se == 0 */
empty = semop(semid,sops,1); //1: lunghezza dell'array sops
printf("\n(P) ho decrementato il semaforo EMPTY: %d\n", semctl(semid,0,GETVAL,0));
//buffer[in]= nextp;
system("sleep 10"); //P + lento di C
printf("\n(P) ho prodotto l'elemento %d\n", in);
in = (in +1) % BUF_DIM;
printf("\n(P) -- signal(empty) -- tento di incrementare il semaforo FULL %d\n",semctl(semid,1,GETVAL,0));
//signal(full) incremento FULL
sops[1].sem_num = 1; /* operazione sul semaforo 2 */
sops[1].sem_op = 1; /* incrementa semaforo 2*/
sops[1].sem_flg = 0; /* che fare: ??*/
full = semop(semid,sops,1);
printf("\n(P) - ho incrementato il semaforo FULL: %d\n" , semctl(semid,1,GETVAL,0));
}
exit(0);
//semctl(semid,IPC_RMID,0);
//printf("(P) Rilasciato i sem, ora muoio... \n");
}
else { //C
while (1){
printf("\n(C) -- wait(full) -- tento di decrementare il semaforo FULL: %d\n",semctl(semid,1,GETVAL,0));
//wait(full)
sops[1].sem_num = 1; /* operazione sul semaforo 0 */
sops[1].sem_op =-1; /* decrementa il semaforo di 1 */
sops[1].sem_flg = 0; /* che fare: wait se semaforo = 0 */
full = semop(semid,sops,1); //1: lunghezza dell'array sops
printf("\n(C) ho decrementato il semaforo FULL: %d\n" , semctl(semid,1,GETVAL,0));
//nextc=buffer[out];
system("sleep 1");
printf("\n(C) ho consumato l'elemento %d\n", out);
out = (out +1) % BUF_DIM;
printf("\n(C) -- signal(empty) -- tento di incrementare il semaforo EMPTY - signal(EMPTY) %d\n" , semctl(semid,0,GETVAL,0));
//signal(empty)
sops[0].sem_num = 0; /* operazione sul semaforo 0 */
sops[0].sem_op = 1; /* incrementa il semaforo di 1 */
sops[0].sem_flg = 0; /* che fare: ?? */
empty = semop(semid,sops,1);
printf("\n(C) -ho incrementato il semaforo EMPTY - signal(EMPTY) %d\n" , semctl(semid,0,GETVAL,0));
}
}
}
Ho scritto questo codice, ma non funziona :( Dove sbaglio?? E' tutta la sera che ci sbatto la testa!
#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/sem.h>
#define ARRAY_LENGTH 2
#define BUF_DIM 4
main() {
int f;
int in=0,out=0;
int empty,full;
char nextp,nextc;
struct sembuf sops[ARRAY_LENGTH];
int semid;
//char buffer[10];
//char *pun;
semid = semget(IPC_PRIVATE,ARRAY_LENGTH,0666); //4 semafori nel set, r/w x tutti!
printf("prelevato set di semafori id = %d\n",semid);
empty = semctl(semid,0,SETVAL,BUF_DIM);
full = semctl(semid,1,SETVAL,0);
printf("Valore iniziale dei semafori:\n");
printf("EMPTY: %d\n",semctl(semid,0,GETVAL,0));
printf("FULL: %d\n",semctl(semid,1,GETVAL,0));
f = fork();
if (f == -1)
{
fprintf(stderr,"fork fallita\n");
exit(1);
}
else if (f !=0) { //P
while (1){
//nextp = 'x';
printf("\n(P) -- wait(empty) -- tento di decrementare il semaforo EMPTY %d\n",semctl(semid,0,GETVAL,0));
//wait(empty) se il valore del sem EMPTY è 0 nn mi fa andare avanti!!
sops[0].sem_num = 0; /* operazione sul semaforo 1 */
sops[0].sem_op = -1; /* decrementa il semaforo di 1 */
sops[0].sem_flg = 0; /* che fare: wait se == 0 */
empty = semop(semid,sops,1); //1: lunghezza dell'array sops
printf("\n(P) ho decrementato il semaforo EMPTY: %d\n", semctl(semid,0,GETVAL,0));
//buffer[in]= nextp;
system("sleep 10"); //P + lento di C
printf("\n(P) ho prodotto l'elemento %d\n", in);
in = (in +1) % BUF_DIM;
printf("\n(P) -- signal(empty) -- tento di incrementare il semaforo FULL %d\n",semctl(semid,1,GETVAL,0));
//signal(full) incremento FULL
sops[1].sem_num = 1; /* operazione sul semaforo 2 */
sops[1].sem_op = 1; /* incrementa semaforo 2*/
sops[1].sem_flg = 0; /* che fare: ??*/
full = semop(semid,sops,1);
printf("\n(P) - ho incrementato il semaforo FULL: %d\n" , semctl(semid,1,GETVAL,0));
}
exit(0);
//semctl(semid,IPC_RMID,0);
//printf("(P) Rilasciato i sem, ora muoio... \n");
}
else { //C
while (1){
printf("\n(C) -- wait(full) -- tento di decrementare il semaforo FULL: %d\n",semctl(semid,1,GETVAL,0));
//wait(full)
sops[1].sem_num = 1; /* operazione sul semaforo 0 */
sops[1].sem_op =-1; /* decrementa il semaforo di 1 */
sops[1].sem_flg = 0; /* che fare: wait se semaforo = 0 */
full = semop(semid,sops,1); //1: lunghezza dell'array sops
printf("\n(C) ho decrementato il semaforo FULL: %d\n" , semctl(semid,1,GETVAL,0));
//nextc=buffer[out];
system("sleep 1");
printf("\n(C) ho consumato l'elemento %d\n", out);
out = (out +1) % BUF_DIM;
printf("\n(C) -- signal(empty) -- tento di incrementare il semaforo EMPTY - signal(EMPTY) %d\n" , semctl(semid,0,GETVAL,0));
//signal(empty)
sops[0].sem_num = 0; /* operazione sul semaforo 0 */
sops[0].sem_op = 1; /* incrementa il semaforo di 1 */
sops[0].sem_flg = 0; /* che fare: ?? */
empty = semop(semid,sops,1);
printf("\n(C) -ho incrementato il semaforo EMPTY - signal(EMPTY) %d\n" , semctl(semid,0,GETVAL,0));
}
}
}